SlideShare a Scribd company logo
ΕΙΣΑΓΩΓΗ ΣΤΗΝ  RUBY Νίκος Δημητρακόπουλος,   Γιάννης Μπουρλάκος  [email_address]   [email_address]   Πανεπιστήμιο Πελοποννήσου Association for Computing Machinery Φοιτητικό Παράρτημα  ACM  Παν. Πελοποννήσου Τρι 12 Δεκ 2006 Έκδοση  1.0.1
Copyright 2006 Dimitrakopoulos Nikolaos, Bourlakos Ioannis.  Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". Κατοχύρωση Πνευμ. Ιδιοκτησίας  2006  Δημητρακόπουλος Νικόλαος, Μπουρλάκος Ιωάννης Παρέχεται η άδεια για αντιγραφή ,  δημοσίευση ή/και   μεταποίηση   αυτού του εγγράφου   υπό τους όρους της Άδειας Χρήσης Ελεύθερης Τεκμηρίωσης  GNU , Έκδοση  1.2  ή μεταγενέστερης έκδοσης   δημοσιευμένης από το  Free Software Foundation ·   δεν περιλαμβάνονται   Αμετάβλητα Αποσπάσματα ,  Κείμενο Εμπροσθοφύλλου   και   Κείμενο Οπισθοφύλλου .  Ένα αντίγραφο της Άδειας Χρήσης περιλαμβάνεται στο κεφάλαιο με τίτλο  “ Άδεια Χρήσης Ελεύθερης Τεκμηρίωσης  GNU".
Γιατί   να   μας   παρακολουθήσετε . .. Η δύναμη της  Ruby  είναι η  απλότητα  και η  περιεκτικότητα  του κώδικά της Είναι μια γλώσσα που υπάγεται στο πλέον διαδεδομένο σχεδιαστικό μοντέλο, το  αντικειμενοστρεφές Είναι μια γλώσσα που μπορεί να βελτιώσει την  παραγωγικότητά  σας, ως εκ τούτου... Άλλωστε, τη γνωρίσαμε, ενθουσιαστήκαμε και θέλουμε να μοιραστούμε τον  ενθουσιασμό  μας!
...και να χρησιμοποιήσετε τη  Ruby! Γιατί άμα αρέσει και σε εσάς, όπως και στον περισσότερο κόσμο που την γνώρισε, τότε σίγουρα  θα ξεχάσετε την  PHP,  την  Perl  και την  Python   για τις  “scripting”  ανάγκες σας Γιατί αυτή τη στιγμή έχει μία τρομερή ώθηση που οφείλεται στο  Rails  (ή αλλιώς  Ruby On Rails   Framework).  Το  Rails  είναι   ένα περιβάλλον ανάπτυξης  web  εφαρμογών που  ελαχιστοποιεί τον χρόνο, τον κόπο και τις γραμμές κώδικα που χρειάζεται  για τον σχεδιασμό και την υλοποίηση μίας  web  εφαρμογής Υποστηρίζει όλες τις  «τεχνολογίες αιχμής»  και τάσεις που κυριαρχούν αυτή τη στιγμή στο  web (XML, feeds, AJAX  κ.λ.π.) Γιατί είναι  “trendy”  αυτή τη στιγμή, με ότι καλό και ότι κακό αυτό συνεπάγεται… Έτσι ,  και αυτή και κυρίως το  Rails,  συμπεριλαμβάνονται στο  buzzword  που λέγεται  Web2.0 .
Τι  δεν   είναι η  Ruby  και ποια είναι τα αρνητικά της… Η  Ruby  μέχρι πριν λίγο καιρό δεν είχε την διάδοση που έχει τώρα. Αυτό έχει ως αποτέλεσμα διάφορα αρνητικά: Τεκμηρίωση Το  documentation  για το  API  που υπάρχει   αυτή τη στιγμή, αλλά και τα περισσότερα κείμενα του επίσημου  site,  δεν είναι και ότι καλύτερο… Βιβλιογραφία Μέχρι στιγμής υπάρχει περιορισμένη βιβλιογραφία για την  Ruby ( και για το  Rails).  Αυτό βέβαια πρόκειται να αλλάξει σύντομα, αφού για το διάστημα Νοέμβριος 2006 – Απρίλιος 2007 είναι προγραμματισμένα για έκδοση πάνω από 8 βιβλία, από διάφορους εκδοτικούς οίκους Απόδοση Σε θέματα απόδοσης είναι αρκετά πίσω σε σχέση με άλλες γλώσσες (και  scripting  αλλά και  compiled).  Αυτό δικαιολογείται αφού αφενός, τώρα ΘΑ μπει στην έκδοση 2 (όταν η  PHP  έχει φτάσει την  5,  και η  Java  αισίως την 6) και αφετέρου αφού  δεν  είχε σχεδιαστεί με πρωταρχικό στόχο την απόδοση, αλλά την  ΕΥΧΡΗΣΤΙΑ !
Εξελίξεις... Στην βιβλιογραφία: Όπως αναφέρθηκε, σύντομα οι διαθέσιμοι τίτλοι σχετικά με την  Ruby  θα  πολλαπλασιαστούν , με ότι θετικό αυτό έχει αλλά και  με ότι αυτό σημαίνει  για μία γλώσσα / τεχνολογία… Στην απόδοση: Όλες οι προσπάθειες που γίνονται από αυτούς που συμμετέχουν στην ανάπτυξη της γλώσσας εστιάζονται σε θέματα απόδοσης  ( τουλάχιστον για την επερχόμενη έκδοση 2). Αυτό σημαίνει ότι αναμένεται  εκθετική βελτίωση σε θέματα απόδοσης … Στην υποστήριξη: Οι μεγάλες εταιρίες αρχίζουν να δείχνουν ενδιαφέρον για αυτήν… Η  Sun ,  προ λίγων ημερών προσέλαβε τον προγραμματιστή που ήταν υπεύθυνος για την  JRuby  (που θα δούμε τι είναι στην συνέχεια…) Η  ΙΒΜ  έχει αρχίσει να δείχνει ενδιαφέρον για το  Rails,  αλλά και την  Ruby
Βοηθητικά εργαλεία της  Ruby -   Συγγραφή κώδικα Επεξεργαστές κειμένου όπως : xemacs vim freeride (IDE  εργαλείο, γραμμένο εξ’ ολοκλήρου στην  Ruby) jedit ...  όποιος άλλος σας βολεύει. Για κάθε 10 προγραμματιστές υπάρχουν 15 αγαπημένοι επεξεργαστές κειμένου
Βοηθητικά εργαλεία της  Ruby -  Περιληπτικά irb (Interactive Ruby): Διαδραστικός μεταφραστής  (interpreter)  της  Ruby ruby (Ruby interpreter): Ο  κλασικός μεταφραστής για την  Ruby ri (Ruby Information): Εργαλείο για την αναζήτηση πληροφοριών σχετικά με μία κλάση, μέθοδο  κ.λ.π.
Βοηθητικά εργαλεία της  Ruby -   Εκτέλεση   (interpreters) Οι  interpreters  (διερμηνείς)  προφανώς είναι απαραίτητοι για την εκτέλεση των  scripts  μας. Έτσι για να εκτελεστεί ένα script πρέπει να έχει στην αρχή του   : #!/usr/bin/ruby –w (Unix-based) Αλλιώς μπορούμε απλά να εκτελέσουμε  ruby -w  όνομα_αρχείου.rb Άλλος τρόπος (κυρίως για δοκιμαστικούς λόγους) είναι ο “διαδραστικός διερμηνέας”, ή αλλιώς στα ελληνικά  Interactive Ruby (irb) .  Πολλές φορές αναφέρεται και ως  ruby shell .
Βοηθητικά εργαλεία της  Ruby –  Εκτέλεση  ( 2 ) JRuby –  Ένας εναλλακτικός  interpreter  γραμμένος σε  Java! : O JRuby  είναι μία υλοποίηση του  Ruby Interpreter,  γραμμένος εξ'ολοκλήρου σε  Java  και αναπτύσεται από την ομάδα  JRuby. Είναι ανοιχτού κώδικα (όπως και  η Ruby)  κάτω από την γνωστή  LGPL/GPL  άδεια . Είναι ενοποιημένο (!) με την  Java  έτσι ώστε να παρέχει τόσο υποστήριξη για  Java κλάσεις  μέσα στα  Ruby  scripts  αλλά και υποστήριξη του  Ruby interpreter  μέσα σε  Java  εφαρμογές !!!
Βοηθητικά εργαλεία της  Ruby -   Τεκμηρίωση Για αναζήτηση μέσα στο  API  της  ruby  χρησιμοποιούμε την εντολή  ri  (Ruby Information) ,   στην κονσόλα – τερματικό του υπολογιστή μας. Είναι ένα πολύ βολικό εργαλείο για την αναζήτηση πληροφοριών σχετικά με μία κλάση, μέθοδο κ.λ.π. Π.χ.:  $ >  ri String ( Πληροφορίες σχετικά με την κλάση  String) $ >  ri Array#sort ( Πληροφορίες σχετικά με την μέθοδο  sort  της κλάσης  Array) $ >  ri sort  ( Πληροφορίες σχετικά με την μέθοδο  sort.  Αν αυτή εμπεριέχεται σε  παραπάνω από μία κλάσεις, θα μας πει τα ονόματά τους ώστε να  ψάξουμε με βάση το προηγούμενο παράδειγμα )
Βοηθητικά εργαλεία της  Ruby -  Τεκμηρίωση  (2) Επίσης, υπάρχει το  rdoc Αντίστοιχο με το  javadoc  της  java Δημιουργεί  html  αρχεία με το  documentation  για τα  modules,  τις κλασεις μας  κ.λ.π...  Τα αρχεία που παράγονται από το  rdoc  είναι και αυτά που ψάχνει το  ri  όταν το χρησιμοποιούμε .
Τέλος Απορίες... Practice makes perfect… ...με τα βαρετά!
Καλό θα ήταν να θυμάστε... αρχές διαδικαστικού προγραμματισμού C, Pascal, Basic κλπ τι περιλαμβάνει το αντικειμενοστρεφές  μοντέλο κλάσεις, αντικείμενα, μέθοδοι κλπ γλώσσες:  Java, C++, Smalltalk κλπ Αν πάλι όχι... Θα σας δώσουμε εμείς μια “γεύση”!
Hello World! Γεια σου και σένα !   puts(’Hello World’)
Δήλωση συναρτήσεων Για να δηλώσουμε μία συνάρτηση: def hello(name) puts('Hello ' + name) end hello(’Nikos’)  def όνομα_συνάρτησης()... end Hello  Nikos
Τα ΠΑΝΤΑ είναι αντικείμενα! Τα μόνα πράγματα που δεν είναι αντικείμενα είναι οι δομές ελέγχου της γλώσσας - κάτι που δεν έχει κάποια άμεση συνέπεια για εμάς. Η  Ruby  δεν έχει κάποιους “ιδιαίτερους τύπους” ( primitive types)  όπως η  Java ,  C ++ κ.λ.π.. Π.χ.:  integer ,  float  κ.λ.π… Τα πάντα στη  Ruby  είναι  αντικείμενα . Άρα: έχουν μια  κλάση  που τα δημιούργησε, έχουν  πεδία  ως εσωτερικά δεδομένα και πράξεις σε αυτά γίνονται μέσω επίκλησης  μεθόδων .
Αντικειμενοστρεφές Μοντέλο Παράδειγμα - Διάλογος - Ρε Νίκο, ποιος έγραψε αυτή τη  Ruby ; - Δε θυμάμαι, μισό να δω το βιβλίο... <ο Νίκος ελέγχει το βιβλίο> - Ο  Yukihiro Matsumoto !
Αντικειμενοστρεφές Μοντέλο Ένα  αντικείμενο  περιλαμβάνει τα  δεδομένα  που το ορίζουν  πεδία   (fields) Κατάσταση αντικειμένου τις  πράξεις  που μπορεί να εκτελέσει στα δεδομένα μέθοδοι   ( methods) Συμπεριφορά αντικειμένου Ένα πρόγραμμα αποτελείται από αντικείμενα που εκτελούν μεθόδους κατ' απαίτηση άλλων αντικειμένων Μεταβίβαση μηνυμάτων  (message passing) .
Αντικειμενοστρεφές Μοντέλο Επεξήγηση παραδείγματος - Ρε Νίκο, ποιος έγραψε αυτή τη  Ruby ; Η  Ruby   έχει  ένα  δημιουργό Ο  Νίκος   έχει  το  βιβλίο  για τη  Ruby Ο  Γιάννης   ρωτάει  το  Νίκο - Δε θυμάμαι, ρε Γιάννη, μισό να δω το βιβλίο... Ο  Νίκος   λέει  στο  Γιάννη  να περιμένει Το  βιβλίο   περιέχει  το  δημιουργό <ο Νίκος ελέγχει το βιβλίο> Ο  Νίκος   ψάχνει  την πληροφορία στο  βιβλίο - Ο  Yukihiro Matsumoto ! Ο  Νίκος   απαντά  στο  Γιάννη
Αντικειμενοστρεφές Μοντέλο Κλάση : ορίζει την υλοποίηση των αντικειμένων καθορίζοντας ποια είναι τα  εσωτερικά δεδομένα  του αντικειμένου και την  υλοποίηση  των  πράξεων  πάνω σε αυτά. Η   κατασκευή  ενός  προγράμματος  απαιτεί  την   ανάπτυξη   αυτών   των   κλάσεων   και   την  κατασκευή αντικειμένων  (στιγμιοτύπηση – instantiation) μέσα από αυτές.
Αντικειμενοστρεφές Μοντέλο Αντικείμενο, κλάση, στιγμιότυπο Αντικείμενο Κλάση Στιγμιότυπο είναι είναι παράγει περιγράφει
Αντικειμενοστρεφές Μοντέλο Κατάσταση και συμπεριφορά περιγράφει ορίζει παράγει Στιγμιότυπο Κατάσταση Συμπεριφορά Κλάση Κατάσταση Συμπεριφορά Κατάσταση_Στιγμ Συμπεριφορά_Στιγμ
Αντικειμενοστρεφές Μοντέλο Αποστολή μηνυμάτων και απόκρυψη κατάστασης επικαλούνται αποκρύπτουν Αντικείμενο1 Κατάσταση1 Συμπεριφορά1 Αντικείμενο 2 Συμπεριφορά2 Κατάσταση2
Αντικειμενοστρεφές Μοντέλο Κληρονομικότητα και πολυμορφισμός κληρονομεί παράγει είναι είδος Κλάση1 (υπερκλάση) Κατάσταση1 Συμπεριφορά1 Κατάσταση_Στιγμ1 Συμπεριφορά_Στιγμ1 Κλάση2 (υποκλάση) Κατάσταση1 Κατάσταση2 Συμπεριφορά1 Συμπεριφορά2 Κατάσταση_Στιγμ1 Κατάσταση_Στιγμ2 Συμπεριφορά_Στιγμ1 Συμπεριφορά_Στιγμ2 Στιγμιότυπο2 Κατάσταση2 Συμπεριφορά2
Τα ΠΑΝΤΑ είναι αντικείμενα! (2) (5.6).round  » 6 (5.6).class  » Float (5.6).round.class  » Fixnum ’ a string’.length  » 8 ’ a string’.class  » String ’ tim tells’.gsub(’t’, ’j’)  » &quot;jim jells&quot; ’ abc’.gsub(’b’, ’xxx’).length  » 5 [’some’, ’things’, ’in’, ’an’, ’array’].length  » 5 [’some’, ’things’, ’in’, ’an’, ’array’].reverse  » [&quot;array&quot;, &quot;an&quot;, &quot;in&quot;, &quot;things&quot;, &quot;some“] 1.+(2)  » 3   ( είναι το ίδιο με το  1 + 2 » 3 )
Δήλωση Κλάσεων Τα πάντα είναι αντικείμενα, είπαμε, που προέρχονται από κλάσεις Πώς τις δηλώνουμε; Απλά: class Person . . . end Και ο κονστράκτορας? Δεν δηλώνεται με το όνομα της κλάσης (όπως στην  Java)  αλλά με  initialize () class Person end def initialize() . . . end Κλάσεις Μέθοδοι κατασκευής  ( constructor)
Δήλωση Κλάσεων –  Πεδία και Μέθοδοι class Person . . . end def initialize(name) @name = name end Τα πεδία δηλώνονται δυναμικά Δεν χρειάζεται να τα δηλώσουμε ΠΡΙΝ τις μεθόδους ή πριν θελήσουμε να τα χρησιμοποιήσουμε Δηλώνονται απλά με  @ ονομα_πεδίου Οι μέθοδοι όπως και οι  συναρτήσεις εκτός της κλάσης δηλώνονται με :  def ονομα_μεθόδου() ... end class Person def initialize(name) @name = name end end def greet return &quot;Hello, my name is  &quot; + @name end Πεδία Μέθοδοι
Δήλωση Κλάσεων –  Κληρονομικότητα Δήλωση υποκλάσης:  class  υποκλάση  <  υπερκλάση ...  end class Matz < Person def initialize super(’Yukihiro Matsumoto’) end end Αναφερόμαστε στην υπερκλάση με το  super ()
Δήλωση Κλάσεων –  Απόκρυψη Κατάστασης  Περιορισμός  πρόσβασης  στα πεδία Ανάγνωση Εγγραφή class DoubleOSeven @full_name = “James Bond” @moneypennys_home = … @ girlfriend = “Vesper” attr_reader :full_name attr_writer :girlfriend end daniel = DoubleOSeven.new puts daniel.full_name daniel.girlfriend = “Solange” puts daniel.girlfriend // uh oh… attr_reader :  οδηγία να κατασκευαστεί μέθοδος που επιστρέφει την τιμή του πεδίου attr_writer : οδηγία να κατασκευαστεί μέθοδος που αλλάζει την τιμή του πεδίου attr_accessor :   και τα δύο μαζί ( reader, writer) προσοχή : οι οδηγίες περιλαμβάνουν σύμβολα με το όνομα του πεδίου (  :field )
Δήλωση Κλάσεων –  Απόκρυψη Κατάστασης  Περιορισμός  ορατότητας  στις μεθόδους private ορατές μόνο στα πλαίσια του στιγμιοτύπου private  attr_reader :account_num protected ορατές μόνο από στιγμιότυπα της κλάσης και των υποκλάσεων protected  attr_writer :num_of_instances public ορατές από όλα τα στιγμιότυπα public  def no_aids print “Take care…” end
Συντακτικοί κανόνες Κατά τη συγγραφή του κώδικα κρίνεται απαραίτητο να υπάρχει ένας  σταθερός τρόπος συγγραφής Έτσι ο κώδικας: Είναι  αναγνώσιμος Έχει ξεκάθαρη  σημασιολογία Συντηρείται  ευκολότερα Στη  Ruby…
Συντακτικοί κανόνες -  Μέθοδοι Οι μέθοδοι όπως είπαμε, ορίζονται ανάμεσα στο  def  και το  end.  puts (“ Πορτοκαλάδα θέτε ;”)  »   Πορτοκαλάδα θέτε ; puts  “ Πορτοκαλάδα θέτε ;”  »  Πορτοκαλάδα θέτε ; def my_method_1 puts “This is my method!” end def multi_foo(count = 3) ’ foo ’ * count end puts multi_foo    »   foo foo foo Μία   μέθοδος  ΠΑΝΤΑ  επιστρέφει την τιμή της τελευταίας πράξης που εκτελέστηκε εκτός και χρησιμοποιούμε την εντολή  return Τα ορίσματα μπορούν να έχουν προκαθορισμένες τιμές Το ίδιο και κατά την κλήση τους  (!) def   my_second_method input puts   input end Οι παρενθέσεις μπορούν να παραληφθούν  (!)
Συντακτικοί κανόνες -  Αριθμοί (1) Δύο τύποι: Ακέραιοι Fixnum (−2 30  to 2 30  −1 ή −2 62  to 2 62 −1) Bignum  (εκτός των προηγούμενων ορίων ) Κινητής υποδιαστολής Σημαντικό:   Όπως και όλα τα άλλα πράγματα στην  Ruby,  οι αριθμοί είναι ΑΝΤΙΚΕΙΜΕΝΑ! Π.χ.: Αν θέλαμε να εκτελέσουμε την εντολή  abs(-15)  στην  C++  π.χ. στην  Ruby  είναι  -15.abs Η  ruby  αυτομάτως παραλείπει τις κάτω παύλες (_)   που βρίσκει μέσα σε αριθμούς  * Αυτή η τεχνική χρησιμοποιείται από πολλούς για την αναπαράσταση των «χιλιάδων» σε μεγάλους αριθμούς.  Έτσι μετά από κάθε 3 ψηφία εισάγουνε μία κάτω παύλα ως εξής 13_432_899.55 . Εδώ η  ruby  δεν θα λάβει υπ’ όψιν της τις παύλες και θα το διαβάσει σαν κανονικό αριθμό με τιμή 13432899.55 *
Για ακεραίους μπορούμε να χρησιμοποιήσουμε εύκολα άλλες βάσεις αρίθμησης πέρα από την δεκαδική: 0 για οχταδική αναπαράσταση 0377   »   255  # Fixnum - octal 0d για δεκαδική (το στανταρ) 1234  »  1234  # Fixnum - dec 0x για δεκαεξαδική 0xaabb   »  43707  # Fixnum - hex 0b για δυαδική -0b10_1010  »  -42  # Fixnum – bin (negated) Σημαντικό: Όπως και όλα τα άλλα πράγματα στην Ruby, οι αριθμοί είναι ΑΝΤΙΚΕΙΜΕΝΑ! Π.χ.: Αν θελαμε να εκτελέσουμε την εντολή abs(-15) στην C++ π.χ. στην Ruby είναι -15.abs Συντακτικοί κανόνες -  Αριθμοί (2)
Συντακτικοί κανόνες -  Συμβολοσειρές (1) Τρόποι για εισαγωγή strings:  “ ...”  : υποστήριξη για χαρακτήρες διαφυγής (όπως \n για νέα γραμμή κλπ...), μεταβλητών, καθώς και των #{} #{} εάν μέσα σε ένα string χρησιμοποιήσουμε αυτό μπορούμε να πάρουμε την τιμή μίας έκφρασης  π.χ.: #{num1 + num2} μας επιστρέφει το άθροισμα των num1 και num2.  Μπορούμε να έχουμε και πολύ πιο περίπλοκες εκφράσεις όπως #{do ... end} κλπ...) &quot;Interpolated #{‘ foo’ * 3 }&quot;  »  &quot;Interpolated foo foo foo &quot; '... '  : υποστηρίζονται ελάχιστοι χαρακτήρες διαφυγής. Έτσι ,  π.χ. το \n θα γραφεί μέσα στο string σαν \n και όχι σαν νέα γραμμή. ’ Simple #{ ‘foo’ * 5 }’  » &quot;Simple #{ ‘foo’ * 5 } ” %q{το κειμενο μας} και %Q{το κείμενό μας}  : ίδια χρήση με τα '...' και “...” αντίστοιχα Π.χ.: Σημαντικό! Μπορούμε αντί για {} να χρησιμοποιήσουμε [] , () ή <> καθώς και οποιονδήποτε άλλο χαρακτήρα μέχρι αυτός να επαναληφθεί! π.χ. %Q!το κειμενο μας...! Εδώ το “!” παίζει τον ρόλο του “περιοριστή”
Συντακτικοί κανόνες -  Ονοματολογία Μεταβλητές και Μέθοδοι counter, my_method κ.λ.π... Μεταβλητές κλάσης:  Με 2 @@: @@number_of_instances , @@table ... Μεταβλητές στιγμιοτύπων Έχουν μπροστά από το όνομά τους το “παπάκι”: @name, @maximum ... Σταθερές Το πρώτο γράμμα ΑΠΑΡΑΙΤΗΤΑ κεφαλαίο! : Type, KEY, R2D2 ... Global μεταβλητες: Με το σύμβολο $ $global, $count Σύμβολα : Με το σύμβολο : : name
Συντακτικοί κανόνες –  Ονοματολογία (2) Οι μεταβλητές και οι μέθοδοι συνηθίζεται να γράφονται με την μέθοδο του snake_notation Οι κλάσεις γράφονται με την μέθοδο του CamelNotation Οι σταθερές γράφονται με όλα τα γράμματα κεφαλαία
Βασικοί Τύποι (έτσι για αρχή...) Συλλογές Δεδομένων Πίνακες Ευρετήρια Εύρη Συμβολοσειρές Κανονικές Εκφράσεις
Συλλογές Δεδομένων Μία γραμμική διάταξη στοιχείων που προσπελαύνονται μέσω: Του ονόματος του πίνακα Της αριθμητικής θέσης του στοιχείου μέσα σε αυτόν ( index) Π.χ.:  my_array = [1,5,10,15] my_array[3]  »  1 5 Ένα   σύνολο   που αντιστοιχίζει: κλειδιά αναζήτησης  ( keys ) στα στοιχεία του  ( values) Π.χ.: my_hash = {1=>”a”, 2=>”b”} my_hash[1]  » “a” Πίνακες  ( Arrays) Ευρετήρια   (Hashes)
Συλλογές Δεδομένων –  Πίνακες Δημιουργία ενός πίνακα : a = [1,2,3,4] a[2]  >> 3 b = [‘nikos’,’giannis’] b[0]  >> nikos a = Array.new a << ‘some’ << ‘things’ << ‘appended’ a[2]  >> appended a[0] = 3 a  >> [3,”things”,”appended”] a = Array.new(5,2) a  >> [2,2,2,2,2] ΠΡΟΣΟΧΗ! a = Array.new(2,’Me’) a  >> [“Me”,”Me”] a[0] << ‘ n you’ a  >> [“Me n you”, “Me n you”]
Συλλογές Δεδομένων –  Πίνακες (2) stack = Array.new stack.push(‘a’) stack.push(‘b’) stack.push(‘c’) stack  >> [“a”,”b”,”c”] stack.pop  >> “c” stack.pop  >> “b” stack.pop  >> “a” stack.pop  >> nil (null) stack  >> [] queue = Array.new queue.push(‘a’).push(‘b’).push(‘c’) queue  >> [“a”,”b”,”c”] queue.shift  >> “a” queue.shift  >> “b” queue.shift  >> “c” queue.shift  >> nil queue  >> [] Οι πίνακες σαν στοίβες (!) Οι πίνακες σαν ουρές (! 2 )
Συλλογές Δεδομένων –  Πίνακες (3) Άλλα ενδιαφέροντα και χρηστικά: Ως γνωστόν ,  η αρίθμηση ξεκινάει από το 0.  Έτσι το τελευταίο στοιχείο ενός πίνακα  a  θα είναι το  a[a.length-1] a = [‘nikos’, ‘giannis’, ‘kostas’, ‘xristos’] a[a.length-1]  >> “xristos” a[10]  >> nil . . //  Καμιά ιδέα τι θα συμβεί άμα δώσουμε  a[-1] ; a[-1]  >> “xristos” (!) //  Απλά αρχίζει και μετράει από το τέλος!   // Ουσιαστικά  index = (a.length+index) mod a.length,  για  index < 0 Τι συμβαίνει όμως όταν δώσουμε αρνητικές τιμές? Ας δούμε ένα παράδειγμα…
Συλλογές Δεδομένων –  Ευρετήρια Παράδειγμα Έστω ότι έχουμε τον εξής (απλοϊκό) κατάλογο για  login : login_acc mi49 Bourlakos Ioannis nikosd Dimitrakopoulos Nikolaos kk24 Kavouras Konstantinos bai21 Vourliotou Anna tst05062 Piskos Stergios
Συλλογές Δεδομένων –  Ευρετήρια (2) login_acc = {  &quot;mi49” => &quot;Bourlakos Ioannis&quot;, &quot;nikosd” =>   &quot; Dimitrakopoulos Nikolaos&quot;, &quot;kk24&quot; => &quot;Kavouras Konstantinos&quot;, &quot;bai21&quot; => &quot;Vourliotou Anna&quot;, &quot;tst05062”  => &quot;Piskos Stergios&quot; } Για να πάρουμε μια τιμή, αρκεί να παράσχουμε το όνομα του κλειδιού που μας ενδιαφέρει . kostas = login_acc[“kk24”] Για να εισάγουμε μια νέα τιμή συνήθως δίνουμε και ένα νέο κλειδί. login_acc[“noob”] = “Gates Bill” Αν εισάγουμε υπάρχον κλειδί τότε η υπάρχουσα τιμή θα αντικατασταθεί από την καινούρια. Ορισμός Χρήση
Συλλογές Δεδομένων –  Ευρετήρια (3) Παράδειγμα Ένα (τετριμμένο) πρόγραμμα ελέγχου σύνδεσης χρήστη: puts &quot;Enter your username:&quot; username = gets name = login_acc[username[0..-2]]  # :-) name = &quot;Unknown&quot; if !name puts &quot;Hello Mr/Mrs #{name}&quot;
Συλλογές Δεδομένων –  Ευρετήρια (4) Γιατί επιλέγω ευρετήρια αντί πίνακες; Δε με νοιάζει η διάταξη των τιμών Μπορώ ως κλειδί ή/και τιμή να εισάγω οποιοδήποτε αντικείμενο. Ευκολότερη (και γρηγορότερη) αναζήτηση Για να βρω την τιμή που θέλω, αρκεί να δώσω το κλειδί.  Αν υπάρχει θα επιστραφεί, αλλιώς  nil.
Βασικοί Τύποι –  Εύρη  ( Ranges) Ας προσπαθήσουμε να διαβάσουμε το εξής: 1..100 Σχεδόν κάθε άνθρωπος, ανεξάρτητα από την γλώσσα που μιλάει θα μπορούσε να φανταστεί ότι είναι μία συντόμευση του «Από 1 … μέχρι 100», δεν νομίζετε? Γιατί στην  Ruby  να είναι διαφορετικά?  
Βασικοί Τύποι –  Εύρη (2) Τα εύρη σαν ακολουθίες τιμών (αριθμών αλλά και συμβολοσειρών) Παράδειγμα: a = (1..5).to_a //  Το  to_a  σημαίνει απλά « to array » b = (“a”..”z”).to_a c = (“a”…”z”).to_a a  >> [1,2,3,4,5] b  >> [“a”,”b”,”c”,”d”,……,”z”] c  >> [“a”,”b”,…..,”y”] //  Χρησιμοποιώντας τις 3 τελείες (…) λέμε στην  Ruby  να  μην λάβει υπ’όψιν της το τελευταίο στοιχείο
Βασικοί Τύποι –  Εύρη (3) Τα εύρη σαν διαστήματα… Μπορεί να θέλουμε να ελέγξουμε ,   εάν  κάτι  είναι μέσα σε ένα συγκεκριμένο εύρος τιμών … Παραδείγματα: (1..10) === 5  >>  true // Είναι σαν να ρωτάμε: «Το 5, είναι ανάμεσα  στο 1 και στο 10?» (1..10) === 15  >>  false (1..10) === 3.14159  >>  true ( ‘a’..’j’)  ===  ‘c’  >> true και ούτω καθ’ εξής…
Βασικοί Τύποι –  Εύρη (4) Θα δούμε στην συνέχεια, πώς τα εύρη χρησιμοποιούνται και βοηθάνε πάρα πολύ στις συνθήκες Δηλαδή σε δομές ελέγχου, όπως: If while for κ.λ.π.
Βασικοί Τύποι  -  String Συμβολοσειρά  (string):  είναι ακολουθία (πίνακας) από χαρακτήρες  8-bit  ( ASCII) . Μια συμβολοσειρά στιγμιοτυπείται από την κλάση  String puts “rofl”.class  >> String Η  κλάση  String  περιέχει πολλές λειτουργικότητες για τα  strings,  εν είδει μεθόδων .
Βασικοί Τύποι  -  String name = “Kleoboulos” name[2]  >> 101   ;-) name[5..8]  >> “oulo” name2 = name name2[4] = “v” name  >> “Kleovoulos” name.gsub “ou”,”u”   >> “Kleovulos” name.reverse  >> “soluovoelK” name.upcase  >> “KLEOVOULOS” name  >> “Kleovoulos” κλπ
Βασικοί Τύποι  -  String Συμπέρασμα: η χρήση τελεστών μεταβάλλει ένα στιγμιότυπο  string αντίθετα, η κλήση μεθόδων επιστρέφει ένα νέο  string  με την εκάστοτε αλλαγή εκτός  αν χρησιμοποιήσουμε το θαυμαστικό  (!)  στο τέλος του ονόματος της μεθόδου Π.χ.  name.reverse!
Έλεγχος ροής -  Αναθέσεις μεταβλητών   (1) Απλές όπως έχουμε ήδη δει: a = 15 b = ‘nikos’ c = “#{b} is the best!” Παράλληλες αναθέσεις: a,b = 15,”nikos” a  >> 15 b  >> “nikos” a,b = b,a a   >> “nikos” b  >> 15 ΠΡΟΣΟΧΗ! a = ‘test’ b = a b  >> “test” b[3] = ‘o’ a  >> “teso” // Η ανάθεση  γίνεται με  αναφορά και όχι  με τιμή! c = a.dup // έτσι  αντιγράφουμε την  τιμή του  a  και όχι  το  a  ( συγκεκριμένα  εδώ για  Strings)
Έλεγχος ροής -  Αναθέσεις μεταβλητών   (2) «Αλυσιδωτές» αναθέσεις: a = b = 4 a +  b  >> 8 Συντομεύσεις: a += 2 a  >> 6 «Σπάσιμο» πινάκων: array = [1,2] a,b = *array a  >> 1 b  >> 2
Έλεγχος Ροής –  Συνθήκες (1) if if (1 + 1 == 2) &quot;Like in school.&quot; else &quot;What a surprise!&quot; end  Προφανώς:  >>  “Like in school” Χμ…  Ας δούμε κάτι πιο ενδιαφέρον..: str = “ βαρετό είναι αυτό… ” str = “ Ωπ! Κάτι ενδιαφέρον! ” if (1 +1 == 2) str  >> “ Ωπ! Κάτι ενδιαφέρον! ” unless unless  (1 + 1 == 2) &quot;Like in school.&quot; else &quot;What a surprise!&quot; end  Το ακριβώς αντίθετο της  if,  δηλαδή:   >>  “What a surprise!” Αυτό ισχύει για όλες τις συνθήκες όπως θα δούμε στην συνέχεια! Α! Και κάτι ακόμα…: (1 + 1 == 2) ?  ‘Working’ : ‘Defect’ Αποτέλεσμα >>  ‘Working’ Το αποτέλεσμα για αληθείς τιμές Το αποτέλεσμα για ψευδείς τιμές
Έλεγχος ροής –  Συνθήκες (2) puts case spam_probability = rand(100) when 0..10 then &quot;Lowest probability: “ + spam_probability.to_s when 10..50 then &quot;Low probability: “ + spam_probability.to_s when 50..90 then &quot;High probability: “ + spam_probability.to_s when 90..100 then &quot;Highest probability: “ + spam_probability.to_s   end case user = gets case user[0..-2].downcase when “monica” then puts “Hello cutie…” when “nikos”,”giannis” then puts “Hello Master” else puts “Hello stanger” end Μετατροπή όλων των χαρακτήρων σε πεζά Αφαίρεση του χαρακτήρα διαφυγής  \n  που διαβάζει η  gets.  Εναλλακτικά θα μπορούσαμε να χρησιμοποιήσουμε:  user.chomp Ανάγνωση από το πληκτρολόγιο Η  case   εδώ χρησιμοποιείται σαν όρισμα στην  puts Η  random(100)   παράγει έναν τυχαίο αριθμό μέχρι το 100
Έλεγχος ροής –  Συνθήκες ( 3 ) def is_true(value) value ? true : false end is_true(false)  » false is_true(nil)  » false is_true(true)  » true is_true(1)  » true is_true(0)  » true is_true([0,1,2])  » true is_true(’a’..’z’)  » true is_true(”)  » true is_true(:a_symbol)  » true Ας δούμε τι είναι  true  και τι  false  σε μία συνθήκη…
Έλεγχος ροής –  Βρόχοι (1) i = 1 while (i < 100) i *= 2 end i  » 128 (i » 128) begin i *= 2 end while (i < 100) i  » 256 i = 1 loop do break i if (i >= 4000) i *= 2 end  » 4096 i  » 4096 r = [] for i in 0..7 next if i % 2 == 0 r << i end  » 0..7 r  » [1, 3, 5, 7] Πηγαίνει στην επόμενη επανάληψη του βρόγχου εάν ισχύει η συνθήκη The classic (almost) way …
Έλεγχος ροής –  Βρόχοι ( 2 ) i  = 1 i *= 2 while (i < 100) i  » 128 The ruby way … (i  » 128) i *= 2 until (i >= 1000)  i  » 1024 (i » 1024) 4.times do i *= 2 end  »  4 i  » 16384 Και πώς θα σας φαινόταν αυτό…? 3.times {  print  &quot;X &quot; } Η αυτό? 1.upto(5) {|i| print i, &quot; &quot; } 99.downto(95) {|i| print i, &quot; &quot; } Και αυτό? Αυτό? 50.step(80, 5) {|i| print i, &quot; &quot; } X X X X X X 1 2 3 4 5 X X X 1 2 3 4 5 99 98 97 96 95 X X X 1 2 3 4 5 99 98 97 96 95 50 55 60 65 70 75 80 Iterations
Μπλοκ κώδικα (1) Μία συνάρτηση μπορεί να παίρνει σαν όρισμα ένα μπλοκ κώδικα Ένα μπλοκ κώδικα αποτελείται από εντολές Η κληθείσα συνάρτηση εκτελεί τον κώδικα του μπλοκ σε ένα συγκεκριμένο σημείο που έχουμε ορίσει εμείς def three_times yield yield yield end three_times { puts &quot;Hello&quot; } Παράγει στην έξοδο Hello Hello Hello
Μπλοκ κώδικα ( 2 ) Μέσα στην μέθοδο  three_times()  το  yield  αντικαθίσταται με τον κώδικα που δίνουμε ανάμεσα στα {}. def three_times yield yield yield end three_times { puts &quot;Hello&quot; } def three_times puts “Hello” puts “Hello” puts “Hello” end Έτσι, ουσιαστικά είναι σαν η μέθοδος  three_times()  να γίνεται ως εξής:
Μπλοκ κώδικα &  Iterations  ( 3 ) Δίπλα στο  yield  μπορούν να αναφέρονται παραπάνω από μία μεταβλητές def fib_up_to(max) i1, i2 = 1, 1 while i1 <= max yield i1 i1, i2 = i2, i1+i2 end end //Και πως θα το καλέσουμε? fib_up_to(1000) {|f| print f, &quot; &quot; } Παράγει στην έξοδο 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 ( Ακολουθία  Fibonacci) Ουσιαστικά η τιμή του  i1  μεταβιβάζεται στο  f,  που έχει οριστεί μέσα στο μπλοκ, ανάμεσα στα | | . Έτσι, στο παράδειγμα αυτό, οι τιμές του  i1  κατά την διάρκεια της επανάληψης  (iterate  σημαίνει   «επανέλαβε»), περνάνε στην μεταβλητή  f  του μπλοκ, και τυπώνονται σε κάθε επανάληψη Δίπλα στο  yield  μπορούμε να δηλώσουμε μεταβλητές Τι αποτέλεσμα θα έχει αυτό? Ας δούμε το παράδειγμα…
Μπλοκ κώδικα &  Iterations  (4) Τώρα που είδαμε τι είναι τα μπλοκ κώδικα και τα  iterations  ας δούμε κάποια χρήσιμα  iterators  της  Ruby: [’i’, ’am’, ’a’, ’banana’].each  do  | entry | print entry, ’ ’  end το  do … end  μπορεί να αντικαταστήσει τα {…} i am a banana fac = 1 » 1 1.upto(5) do | i | fac *= i end » 1   fac  » 120 a = (“a”..”e”).to_a » [“a”,”b”,”c”, “d”, “e”] a.map { | entry | entry + “!” }  » [“a!”,”b!”,”c!”, “d!”, “e!”] a » [“a”,”b”,”c”, “d”, “e”] a » [“a”,”b”,”c”, “d”, “e”] a.inject { | sequence, letter | sequence + letter }  » “abcde” a » [“a”,”b”,”c”, “d”, “e”]
Μπλοκ κώδικα &  Iterations  ( 5 ) Πότε βάζουμε {  || …  } και πότε  do || … end ?   Κατά σύμβαση συνηθίζεται: do || … end :  Όταν αυτό που μας ενδιαφέρει κυρίως  είναι το αποτέλεσμα των εντολών που  έχουμε εισάγει στο μπλοκ. Π.χ.: { || … }  : Όταν αυτό που κυρίως μας ενδιαφέρει  είναι η τιμή που επιστρέφεται από την  επανάληψη. Π.χ.:  [1,2,3,4,5].each do | e | puts e end [1,2,3,4,5].map { | e | e * e }  » [1, 4, 9, 16, 25]
Βασικοί Τύποι  -  Regexp Κανονική έκφραση   (regular expression) :  είναι  o  συνοπτικός ορισμός ομοιότητας των στοιχείων ενός συνόλου από  strings. Πρακτικά, μια κανονική έκφραση καθορίζει  αν ένα  string  επαληθεύεται από ένα συγκεκριμένο πρότυπο , ως ακολουθία χαρακτήρων . Στην ουσία, λοιπόν, μιλάμε για είδη συνθηκών. Στη  Ruby,  μια κανονική έκφραση είναι στιγμιότυπο της κλάσης  Regexp.
Βασικοί Τύποι  -  Regexp Σύμβολο   (symbol) Έστω το σύμβολο  a. Αν  το string  περιλαμβάνει  το  σύμβολο  a  τότε ανήκει στο σύνολο (επαληθεύεται). “ mississippi” =~ /s/  >> 2 “ mississippi” =~ /a/  >> nil Ο  χαρακτήρας  .  επαληθεύει οποιοδήποτε σύμβολο Εναλλαγή   (alternation) Έστω δύο (ή περισσότερες) κανονικές εκφράσεις Αν  το string  επαληθεύεται από  μία εκ των όσων , τότε επαληθεύεται από την εναλλαγή “ mississippi” =~ /[dsia]/  >> 1
Βασικοί Τύποι  -  Regexp Συνένωση   (concatenation) Έστω δύο (ή περισσότερες) κανονικές εκφράσεις Αν ένα  string  επαληθεύεται από την  αλληλουχία  των εκφράσεων, τότε επαληθεύεται από τη συνένωση. “ mississippi” =~ /i[sp][sp]/  >> 1 “ mississippi” =~ /i[sp]i/  >> nil Επανάληψη   (repetition – Kleene closure) Έστω μια κανονική έκφραση. Αν επαληθεύεται  0 ή  περισσότερες φορές  η έκφραση στο  string  τότε επαληθεύεται από την επανάληψη. “ mississippi” =~ /(si)*/  >> 0 “ mississippi” =~ /(is)*s/  >> 1
Βασικοί Τύποι  -  Regexp Πρόθεμα   (prefix) Έστω μια έκφραση. Αν αυτή επαληθεύει την  αρχή του  string ,  τότε το  string  επαληθεύεται από το πρόθεμα . “ mississippi” =~ /^mis/  >> 0 “ mississippi” =~ /^mip/  >> nil Επίθεμα   (suffix) Έστω μια έκφραση. Αν αυτή επαληθεύει το  τέλος του  string ,  τότε επαληθεύεται από το επίθεμα . “ mississippi” =~ /sppi$/  >> nil “ mississippi” =~ /(p)*i$/  >> 8
Βασικοί Τύποι  -  Regexp Η προτεραιότητα μεταξύ των επαληθεύσεων είναι: Επανάληψη Συνένωση Εναλλαγή Πρόθεμα / Επίθεμα Σύμβολο Αν θέλουμε να εισάγουμε κάποιον από τους χαρακτήρες σε μια κανονική έκφραση: .  |  (  )  [  ]  {  }  +  \  ^  $  *  ? τότε τους εισάγουμε προθέτοντας το χαρακτήρα διαφυγής  \ (backslash).
Μέχρι την επόμενη φορά... Ερωτήσεις & Απαντήσεις
Θέματα που δεν καλύφθηκαν… Threads Χειρισμός εξαιρέσεων ( Exceptions / Exception Handling) I/O Υπερφόρτωση τελεστών Mixins ( αντί για πολλαπλή κληρονομικότητα – αντίστοιχο με τα  interfaces  της  Java) Modules ( αντίστοιχο με τα  packages  της  Java) Προέκταση υπαρχουσών κλάσεων Unit Testing Βιβλιοθήκες /  bindings  για ανάπτυξη  GUI Υπάρχει ενδιαφέρον για επόμενο σεμινάριο???
Ιδέες και σκέψεις για δράσεις… Δημιουργία υποστηρικτικού υλικού (παρουσιάσεις,  tutorials, how-to’s,  κείμενα κ.λ.π.) Δημιουργία  site  / ruby-hellug (Hellenic User Group) Διοργάνωση 2 ου  σεμιναρίου για την  Ruby  με τα θέματα που αναφέρθηκαν πριν Διοργάνωση σεμιναρίου με θέμα το περιβάλλον ανάπτυξης  web  εφαρμογών  Ruby On Rails Συμμετάσχετε και εσείς!
Υλικό και νέα σχετικά με την  Ruby  στο διαδίκτυο… http://www.ruby-lang.org/en/ Η επίσημη ιστοσελίδα της  Ruby.  Περιέχει ενημερωτικό υλικό, νέα, τα εργαλεία για την  Ruby (interpreter, ri, gems  κλπ…) καθώς και εκπαιδευτικό υλικό και  wiki http://www.ruby-forum.com/ Λίστες ταχυδρομείου και  forums  για την  Ruby http://wiki.rubygarden.org/Ruby Καταπληκτικό  wiki  με υλικό και πληροφορίες σχετικά με οτιδήποτε έχει να κάνει με την  Ruby ( από κοινότητες χρηστών μέχρι  FAQ  και  Howto’s) http://www.ruby-doc.org/ Όπως λέει και το όνομα της σελίδας  documentation  και υποστηρικτικό υλικό http://www.rubyinside.com/ Νέα αλλά και  tutorials  σχετικά με την  Ruby http://rubycorner.com/ News aggregation  από 260++  blogs, forums, mailing lists  κ.λ.π.!
Βιβλιογραφία (1) “ Programming Ruby: The Pragmatic Programmers' Guide, Second Edition” D. Thomas The Pragmatic Programmers, LLC, 2005 “ Design Patterns: Elements of Reusable Object-Oriented Software” E. Gamma, R. Helm, R. Johnson, J. Vlissides Addison-Wesley, 1995
Βιβλιογραφία (2) http://www.ruby-doc.org/ <Various Authors> “ 30 Second Rule” and James Britt, 2006 “ Ruby Course: an immersive programming course” B. Schroeder Brian Schroeder, 2004-2006
Άδεια Χρήσης Ελεύθερης Τεκμηρίωσης  GNU http://www.fsf.org/licensing/licenses/fdl.txt
Σας ευχαριστούμε για την παρουσία και την προσοχή σας. Μας τιμάτε. Ν. Δημητρακόπουλος, Γ. Μπουρλάκος

More Related Content

PPTX
Microsoft Hellas Dev Days 09: IronRuby
PPT
Ruby On Rails Introduction [Εισαγωγή στο Rails]
PPTX
Getting to Equal 2017
PPT
Ruby on rails - TEI Peiraeus
PDF
553193902-2-Intro-to-Java.pdf
PDF
Giorgos Karagiannoulos
PPS
Πολυμέσα - Θεωρία Α Λυκείου
PDF
Python tutorial by example
Microsoft Hellas Dev Days 09: IronRuby
Ruby On Rails Introduction [Εισαγωγή στο Rails]
Getting to Equal 2017
Ruby on rails - TEI Peiraeus
553193902-2-Intro-to-Java.pdf
Giorgos Karagiannoulos
Πολυμέσα - Θεωρία Α Λυκείου
Python tutorial by example

Similar to Introduction to Ruby [Εισαγωγή στην Ruby] (20)

DOCX
Η γλώσσα προγραμματισμού C++.
PDF
Java free-book
PDF
Σύγχρονες μεθοδολογίες ανάπτυξης και διαχείρισης Πληροφοριακών Συστημάτων Β.pdf
DOCX
Προγραμματισμός σε Clipper - 1
PPT
κεφ 6 ανάπτυξη εφαρμογών
PPTX
Εισαγωγή σε C# και .ΝΕΤ
PDF
DATAMANAGEMENT.GR - DIGITAL TRANSFORMATION AND STRATEGY
PDF
DH2 EN1 new.pdf
PPT
grails framework
DOC
Η γλώσσα προγραμματισμού GW – Βasic.
PPTX
PPT
Python. 1 1 σχεδίαση και συγγραφή κώδικα
PPTX
Τσιουμπρής_HOU-CS-UGP-2015-21
DOC
Η γλώσσα προγραμματισμού Clipper.
PPT
Κεφ. 6 Εισαγωγή στον Προγραμματισμό
PDF
C_27102023.pdf
DOCX
Η γλώσσα προγραμματισμού Java.
DOCX
Η γλώσσα προγραμματισμού C.
PPTX
Επικοινωνία & συγχρονισμός, αλληλεπίδραση με το χρήστη, παράλληλος προγραμματ...
PPTX
Η γλώσσα προγραμματισμού C++.
Java free-book
Σύγχρονες μεθοδολογίες ανάπτυξης και διαχείρισης Πληροφοριακών Συστημάτων Β.pdf
Προγραμματισμός σε Clipper - 1
κεφ 6 ανάπτυξη εφαρμογών
Εισαγωγή σε C# και .ΝΕΤ
DATAMANAGEMENT.GR - DIGITAL TRANSFORMATION AND STRATEGY
DH2 EN1 new.pdf
grails framework
Η γλώσσα προγραμματισμού GW – Βasic.
Python. 1 1 σχεδίαση και συγγραφή κώδικα
Τσιουμπρής_HOU-CS-UGP-2015-21
Η γλώσσα προγραμματισμού Clipper.
Κεφ. 6 Εισαγωγή στον Προγραμματισμό
C_27102023.pdf
Η γλώσσα προγραμματισμού Java.
Η γλώσσα προγραμματισμού C.
Επικοινωνία & συγχρονισμός, αλληλεπίδραση με το χρήστη, παράλληλος προγραμματ...
Ad

More from Nikos Dimitrakopoulos (6)

PDF
Lean meetings (Athens Ruby Meetup #25)
PDF
Building a globalized, customer facing e-commerce product, powered by micro-s...
PDF
Single Sign On in Ruby - Enterprise Ready!
PPTX
Athens Ruby Meetup #3: IronRuby
PPTX
A Blink Into The Rails Magic
PDF
Things Learned From Rails
Lean meetings (Athens Ruby Meetup #25)
Building a globalized, customer facing e-commerce product, powered by micro-s...
Single Sign On in Ruby - Enterprise Ready!
Athens Ruby Meetup #3: IronRuby
A Blink Into The Rails Magic
Things Learned From Rails
Ad

Introduction to Ruby [Εισαγωγή στην Ruby]

  • 1. ΕΙΣΑΓΩΓΗ ΣΤΗΝ RUBY Νίκος Δημητρακόπουλος, Γιάννης Μπουρλάκος [email_address] [email_address] Πανεπιστήμιο Πελοποννήσου Association for Computing Machinery Φοιτητικό Παράρτημα ACM Παν. Πελοποννήσου Τρι 12 Δεκ 2006 Έκδοση 1.0.1
  • 2. Copyright 2006 Dimitrakopoulos Nikolaos, Bourlakos Ioannis. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled &quot;GNU Free Documentation License&quot;. Κατοχύρωση Πνευμ. Ιδιοκτησίας 2006 Δημητρακόπουλος Νικόλαος, Μπουρλάκος Ιωάννης Παρέχεται η άδεια για αντιγραφή , δημοσίευση ή/και μεταποίηση αυτού του εγγράφου υπό τους όρους της Άδειας Χρήσης Ελεύθερης Τεκμηρίωσης GNU , Έκδοση 1.2 ή μεταγενέστερης έκδοσης δημοσιευμένης από το Free Software Foundation · δεν περιλαμβάνονται Αμετάβλητα Αποσπάσματα , Κείμενο Εμπροσθοφύλλου και Κείμενο Οπισθοφύλλου . Ένα αντίγραφο της Άδειας Χρήσης περιλαμβάνεται στο κεφάλαιο με τίτλο “ Άδεια Χρήσης Ελεύθερης Τεκμηρίωσης GNU&quot;.
  • 3. Γιατί να μας παρακολουθήσετε . .. Η δύναμη της Ruby είναι η απλότητα και η περιεκτικότητα του κώδικά της Είναι μια γλώσσα που υπάγεται στο πλέον διαδεδομένο σχεδιαστικό μοντέλο, το αντικειμενοστρεφές Είναι μια γλώσσα που μπορεί να βελτιώσει την παραγωγικότητά σας, ως εκ τούτου... Άλλωστε, τη γνωρίσαμε, ενθουσιαστήκαμε και θέλουμε να μοιραστούμε τον ενθουσιασμό μας!
  • 4. ...και να χρησιμοποιήσετε τη Ruby! Γιατί άμα αρέσει και σε εσάς, όπως και στον περισσότερο κόσμο που την γνώρισε, τότε σίγουρα θα ξεχάσετε την PHP, την Perl και την Python για τις “scripting” ανάγκες σας Γιατί αυτή τη στιγμή έχει μία τρομερή ώθηση που οφείλεται στο Rails (ή αλλιώς Ruby On Rails Framework). Το Rails είναι ένα περιβάλλον ανάπτυξης web εφαρμογών που ελαχιστοποιεί τον χρόνο, τον κόπο και τις γραμμές κώδικα που χρειάζεται για τον σχεδιασμό και την υλοποίηση μίας web εφαρμογής Υποστηρίζει όλες τις «τεχνολογίες αιχμής» και τάσεις που κυριαρχούν αυτή τη στιγμή στο web (XML, feeds, AJAX κ.λ.π.) Γιατί είναι “trendy” αυτή τη στιγμή, με ότι καλό και ότι κακό αυτό συνεπάγεται… Έτσι , και αυτή και κυρίως το Rails, συμπεριλαμβάνονται στο buzzword που λέγεται Web2.0 .
  • 5. Τι δεν είναι η Ruby και ποια είναι τα αρνητικά της… Η Ruby μέχρι πριν λίγο καιρό δεν είχε την διάδοση που έχει τώρα. Αυτό έχει ως αποτέλεσμα διάφορα αρνητικά: Τεκμηρίωση Το documentation για το API που υπάρχει αυτή τη στιγμή, αλλά και τα περισσότερα κείμενα του επίσημου site, δεν είναι και ότι καλύτερο… Βιβλιογραφία Μέχρι στιγμής υπάρχει περιορισμένη βιβλιογραφία για την Ruby ( και για το Rails). Αυτό βέβαια πρόκειται να αλλάξει σύντομα, αφού για το διάστημα Νοέμβριος 2006 – Απρίλιος 2007 είναι προγραμματισμένα για έκδοση πάνω από 8 βιβλία, από διάφορους εκδοτικούς οίκους Απόδοση Σε θέματα απόδοσης είναι αρκετά πίσω σε σχέση με άλλες γλώσσες (και scripting αλλά και compiled). Αυτό δικαιολογείται αφού αφενός, τώρα ΘΑ μπει στην έκδοση 2 (όταν η PHP έχει φτάσει την 5, και η Java αισίως την 6) και αφετέρου αφού δεν είχε σχεδιαστεί με πρωταρχικό στόχο την απόδοση, αλλά την ΕΥΧΡΗΣΤΙΑ !
  • 6. Εξελίξεις... Στην βιβλιογραφία: Όπως αναφέρθηκε, σύντομα οι διαθέσιμοι τίτλοι σχετικά με την Ruby θα πολλαπλασιαστούν , με ότι θετικό αυτό έχει αλλά και με ότι αυτό σημαίνει για μία γλώσσα / τεχνολογία… Στην απόδοση: Όλες οι προσπάθειες που γίνονται από αυτούς που συμμετέχουν στην ανάπτυξη της γλώσσας εστιάζονται σε θέματα απόδοσης ( τουλάχιστον για την επερχόμενη έκδοση 2). Αυτό σημαίνει ότι αναμένεται εκθετική βελτίωση σε θέματα απόδοσης … Στην υποστήριξη: Οι μεγάλες εταιρίες αρχίζουν να δείχνουν ενδιαφέρον για αυτήν… Η Sun , προ λίγων ημερών προσέλαβε τον προγραμματιστή που ήταν υπεύθυνος για την JRuby (που θα δούμε τι είναι στην συνέχεια…) Η ΙΒΜ έχει αρχίσει να δείχνει ενδιαφέρον για το Rails, αλλά και την Ruby
  • 7. Βοηθητικά εργαλεία της Ruby - Συγγραφή κώδικα Επεξεργαστές κειμένου όπως : xemacs vim freeride (IDE εργαλείο, γραμμένο εξ’ ολοκλήρου στην Ruby) jedit ... όποιος άλλος σας βολεύει. Για κάθε 10 προγραμματιστές υπάρχουν 15 αγαπημένοι επεξεργαστές κειμένου
  • 8. Βοηθητικά εργαλεία της Ruby - Περιληπτικά irb (Interactive Ruby): Διαδραστικός μεταφραστής (interpreter) της Ruby ruby (Ruby interpreter): Ο κλασικός μεταφραστής για την Ruby ri (Ruby Information): Εργαλείο για την αναζήτηση πληροφοριών σχετικά με μία κλάση, μέθοδο κ.λ.π.
  • 9. Βοηθητικά εργαλεία της Ruby - Εκτέλεση (interpreters) Οι interpreters (διερμηνείς) προφανώς είναι απαραίτητοι για την εκτέλεση των scripts μας. Έτσι για να εκτελεστεί ένα script πρέπει να έχει στην αρχή του : #!/usr/bin/ruby –w (Unix-based) Αλλιώς μπορούμε απλά να εκτελέσουμε ruby -w όνομα_αρχείου.rb Άλλος τρόπος (κυρίως για δοκιμαστικούς λόγους) είναι ο “διαδραστικός διερμηνέας”, ή αλλιώς στα ελληνικά Interactive Ruby (irb) . Πολλές φορές αναφέρεται και ως ruby shell .
  • 10. Βοηθητικά εργαλεία της Ruby – Εκτέλεση ( 2 ) JRuby – Ένας εναλλακτικός interpreter γραμμένος σε Java! : O JRuby είναι μία υλοποίηση του Ruby Interpreter, γραμμένος εξ'ολοκλήρου σε Java και αναπτύσεται από την ομάδα JRuby. Είναι ανοιχτού κώδικα (όπως και η Ruby) κάτω από την γνωστή LGPL/GPL άδεια . Είναι ενοποιημένο (!) με την Java έτσι ώστε να παρέχει τόσο υποστήριξη για Java κλάσεις μέσα στα Ruby scripts αλλά και υποστήριξη του Ruby interpreter μέσα σε Java εφαρμογές !!!
  • 11. Βοηθητικά εργαλεία της Ruby - Τεκμηρίωση Για αναζήτηση μέσα στο API της ruby χρησιμοποιούμε την εντολή ri (Ruby Information) , στην κονσόλα – τερματικό του υπολογιστή μας. Είναι ένα πολύ βολικό εργαλείο για την αναζήτηση πληροφοριών σχετικά με μία κλάση, μέθοδο κ.λ.π. Π.χ.: $ > ri String ( Πληροφορίες σχετικά με την κλάση String) $ > ri Array#sort ( Πληροφορίες σχετικά με την μέθοδο sort της κλάσης Array) $ > ri sort ( Πληροφορίες σχετικά με την μέθοδο sort. Αν αυτή εμπεριέχεται σε παραπάνω από μία κλάσεις, θα μας πει τα ονόματά τους ώστε να ψάξουμε με βάση το προηγούμενο παράδειγμα )
  • 12. Βοηθητικά εργαλεία της Ruby - Τεκμηρίωση (2) Επίσης, υπάρχει το rdoc Αντίστοιχο με το javadoc της java Δημιουργεί html αρχεία με το documentation για τα modules, τις κλασεις μας κ.λ.π... Τα αρχεία που παράγονται από το rdoc είναι και αυτά που ψάχνει το ri όταν το χρησιμοποιούμε .
  • 13. Τέλος Απορίες... Practice makes perfect… ...με τα βαρετά!
  • 14. Καλό θα ήταν να θυμάστε... αρχές διαδικαστικού προγραμματισμού C, Pascal, Basic κλπ τι περιλαμβάνει το αντικειμενοστρεφές μοντέλο κλάσεις, αντικείμενα, μέθοδοι κλπ γλώσσες: Java, C++, Smalltalk κλπ Αν πάλι όχι... Θα σας δώσουμε εμείς μια “γεύση”!
  • 15. Hello World! Γεια σου και σένα !  puts(’Hello World’)
  • 16. Δήλωση συναρτήσεων Για να δηλώσουμε μία συνάρτηση: def hello(name) puts('Hello ' + name) end hello(’Nikos’) def όνομα_συνάρτησης()... end Hello Nikos
  • 17. Τα ΠΑΝΤΑ είναι αντικείμενα! Τα μόνα πράγματα που δεν είναι αντικείμενα είναι οι δομές ελέγχου της γλώσσας - κάτι που δεν έχει κάποια άμεση συνέπεια για εμάς. Η Ruby δεν έχει κάποιους “ιδιαίτερους τύπους” ( primitive types) όπως η Java , C ++ κ.λ.π.. Π.χ.: integer , float κ.λ.π… Τα πάντα στη Ruby είναι αντικείμενα . Άρα: έχουν μια κλάση που τα δημιούργησε, έχουν πεδία ως εσωτερικά δεδομένα και πράξεις σε αυτά γίνονται μέσω επίκλησης μεθόδων .
  • 18. Αντικειμενοστρεφές Μοντέλο Παράδειγμα - Διάλογος - Ρε Νίκο, ποιος έγραψε αυτή τη Ruby ; - Δε θυμάμαι, μισό να δω το βιβλίο... <ο Νίκος ελέγχει το βιβλίο> - Ο Yukihiro Matsumoto !
  • 19. Αντικειμενοστρεφές Μοντέλο Ένα αντικείμενο περιλαμβάνει τα δεδομένα που το ορίζουν πεδία (fields) Κατάσταση αντικειμένου τις πράξεις που μπορεί να εκτελέσει στα δεδομένα μέθοδοι ( methods) Συμπεριφορά αντικειμένου Ένα πρόγραμμα αποτελείται από αντικείμενα που εκτελούν μεθόδους κατ' απαίτηση άλλων αντικειμένων Μεταβίβαση μηνυμάτων (message passing) .
  • 20. Αντικειμενοστρεφές Μοντέλο Επεξήγηση παραδείγματος - Ρε Νίκο, ποιος έγραψε αυτή τη Ruby ; Η Ruby έχει ένα δημιουργό Ο Νίκος έχει το βιβλίο για τη Ruby Ο Γιάννης ρωτάει το Νίκο - Δε θυμάμαι, ρε Γιάννη, μισό να δω το βιβλίο... Ο Νίκος λέει στο Γιάννη να περιμένει Το βιβλίο περιέχει το δημιουργό <ο Νίκος ελέγχει το βιβλίο> Ο Νίκος ψάχνει την πληροφορία στο βιβλίο - Ο Yukihiro Matsumoto ! Ο Νίκος απαντά στο Γιάννη
  • 21. Αντικειμενοστρεφές Μοντέλο Κλάση : ορίζει την υλοποίηση των αντικειμένων καθορίζοντας ποια είναι τα εσωτερικά δεδομένα του αντικειμένου και την υλοποίηση των πράξεων πάνω σε αυτά. Η κατασκευή ενός προγράμματος απαιτεί την ανάπτυξη αυτών των κλάσεων και την κατασκευή αντικειμένων (στιγμιοτύπηση – instantiation) μέσα από αυτές.
  • 22. Αντικειμενοστρεφές Μοντέλο Αντικείμενο, κλάση, στιγμιότυπο Αντικείμενο Κλάση Στιγμιότυπο είναι είναι παράγει περιγράφει
  • 23. Αντικειμενοστρεφές Μοντέλο Κατάσταση και συμπεριφορά περιγράφει ορίζει παράγει Στιγμιότυπο Κατάσταση Συμπεριφορά Κλάση Κατάσταση Συμπεριφορά Κατάσταση_Στιγμ Συμπεριφορά_Στιγμ
  • 24. Αντικειμενοστρεφές Μοντέλο Αποστολή μηνυμάτων και απόκρυψη κατάστασης επικαλούνται αποκρύπτουν Αντικείμενο1 Κατάσταση1 Συμπεριφορά1 Αντικείμενο 2 Συμπεριφορά2 Κατάσταση2
  • 25. Αντικειμενοστρεφές Μοντέλο Κληρονομικότητα και πολυμορφισμός κληρονομεί παράγει είναι είδος Κλάση1 (υπερκλάση) Κατάσταση1 Συμπεριφορά1 Κατάσταση_Στιγμ1 Συμπεριφορά_Στιγμ1 Κλάση2 (υποκλάση) Κατάσταση1 Κατάσταση2 Συμπεριφορά1 Συμπεριφορά2 Κατάσταση_Στιγμ1 Κατάσταση_Στιγμ2 Συμπεριφορά_Στιγμ1 Συμπεριφορά_Στιγμ2 Στιγμιότυπο2 Κατάσταση2 Συμπεριφορά2
  • 26. Τα ΠΑΝΤΑ είναι αντικείμενα! (2) (5.6).round » 6 (5.6).class » Float (5.6).round.class » Fixnum ’ a string’.length » 8 ’ a string’.class » String ’ tim tells’.gsub(’t’, ’j’) » &quot;jim jells&quot; ’ abc’.gsub(’b’, ’xxx’).length » 5 [’some’, ’things’, ’in’, ’an’, ’array’].length » 5 [’some’, ’things’, ’in’, ’an’, ’array’].reverse » [&quot;array&quot;, &quot;an&quot;, &quot;in&quot;, &quot;things&quot;, &quot;some“] 1.+(2) » 3 ( είναι το ίδιο με το 1 + 2 » 3 )
  • 27. Δήλωση Κλάσεων Τα πάντα είναι αντικείμενα, είπαμε, που προέρχονται από κλάσεις Πώς τις δηλώνουμε; Απλά: class Person . . . end Και ο κονστράκτορας? Δεν δηλώνεται με το όνομα της κλάσης (όπως στην Java) αλλά με initialize () class Person end def initialize() . . . end Κλάσεις Μέθοδοι κατασκευής ( constructor)
  • 28. Δήλωση Κλάσεων – Πεδία και Μέθοδοι class Person . . . end def initialize(name) @name = name end Τα πεδία δηλώνονται δυναμικά Δεν χρειάζεται να τα δηλώσουμε ΠΡΙΝ τις μεθόδους ή πριν θελήσουμε να τα χρησιμοποιήσουμε Δηλώνονται απλά με @ ονομα_πεδίου Οι μέθοδοι όπως και οι συναρτήσεις εκτός της κλάσης δηλώνονται με : def ονομα_μεθόδου() ... end class Person def initialize(name) @name = name end end def greet return &quot;Hello, my name is &quot; + @name end Πεδία Μέθοδοι
  • 29. Δήλωση Κλάσεων – Κληρονομικότητα Δήλωση υποκλάσης: class υποκλάση < υπερκλάση ... end class Matz < Person def initialize super(’Yukihiro Matsumoto’) end end Αναφερόμαστε στην υπερκλάση με το super ()
  • 30. Δήλωση Κλάσεων – Απόκρυψη Κατάστασης Περιορισμός πρόσβασης στα πεδία Ανάγνωση Εγγραφή class DoubleOSeven @full_name = “James Bond” @moneypennys_home = … @ girlfriend = “Vesper” attr_reader :full_name attr_writer :girlfriend end daniel = DoubleOSeven.new puts daniel.full_name daniel.girlfriend = “Solange” puts daniel.girlfriend // uh oh… attr_reader : οδηγία να κατασκευαστεί μέθοδος που επιστρέφει την τιμή του πεδίου attr_writer : οδηγία να κατασκευαστεί μέθοδος που αλλάζει την τιμή του πεδίου attr_accessor : και τα δύο μαζί ( reader, writer) προσοχή : οι οδηγίες περιλαμβάνουν σύμβολα με το όνομα του πεδίου ( :field )
  • 31. Δήλωση Κλάσεων – Απόκρυψη Κατάστασης Περιορισμός ορατότητας στις μεθόδους private ορατές μόνο στα πλαίσια του στιγμιοτύπου private attr_reader :account_num protected ορατές μόνο από στιγμιότυπα της κλάσης και των υποκλάσεων protected attr_writer :num_of_instances public ορατές από όλα τα στιγμιότυπα public def no_aids print “Take care…” end
  • 32. Συντακτικοί κανόνες Κατά τη συγγραφή του κώδικα κρίνεται απαραίτητο να υπάρχει ένας σταθερός τρόπος συγγραφής Έτσι ο κώδικας: Είναι αναγνώσιμος Έχει ξεκάθαρη σημασιολογία Συντηρείται ευκολότερα Στη Ruby…
  • 33. Συντακτικοί κανόνες - Μέθοδοι Οι μέθοδοι όπως είπαμε, ορίζονται ανάμεσα στο def και το end. puts (“ Πορτοκαλάδα θέτε ;”) » Πορτοκαλάδα θέτε ; puts “ Πορτοκαλάδα θέτε ;” » Πορτοκαλάδα θέτε ; def my_method_1 puts “This is my method!” end def multi_foo(count = 3) ’ foo ’ * count end puts multi_foo » foo foo foo Μία μέθοδος ΠΑΝΤΑ επιστρέφει την τιμή της τελευταίας πράξης που εκτελέστηκε εκτός και χρησιμοποιούμε την εντολή return Τα ορίσματα μπορούν να έχουν προκαθορισμένες τιμές Το ίδιο και κατά την κλήση τους (!) def my_second_method input puts input end Οι παρενθέσεις μπορούν να παραληφθούν (!)
  • 34. Συντακτικοί κανόνες - Αριθμοί (1) Δύο τύποι: Ακέραιοι Fixnum (−2 30 to 2 30 −1 ή −2 62 to 2 62 −1) Bignum (εκτός των προηγούμενων ορίων ) Κινητής υποδιαστολής Σημαντικό: Όπως και όλα τα άλλα πράγματα στην Ruby, οι αριθμοί είναι ΑΝΤΙΚΕΙΜΕΝΑ! Π.χ.: Αν θέλαμε να εκτελέσουμε την εντολή abs(-15) στην C++ π.χ. στην Ruby είναι -15.abs Η ruby αυτομάτως παραλείπει τις κάτω παύλες (_) που βρίσκει μέσα σε αριθμούς * Αυτή η τεχνική χρησιμοποιείται από πολλούς για την αναπαράσταση των «χιλιάδων» σε μεγάλους αριθμούς. Έτσι μετά από κάθε 3 ψηφία εισάγουνε μία κάτω παύλα ως εξής 13_432_899.55 . Εδώ η ruby δεν θα λάβει υπ’ όψιν της τις παύλες και θα το διαβάσει σαν κανονικό αριθμό με τιμή 13432899.55 *
  • 35. Για ακεραίους μπορούμε να χρησιμοποιήσουμε εύκολα άλλες βάσεις αρίθμησης πέρα από την δεκαδική: 0 για οχταδική αναπαράσταση 0377 » 255 # Fixnum - octal 0d για δεκαδική (το στανταρ) 1234 » 1234 # Fixnum - dec 0x για δεκαεξαδική 0xaabb » 43707 # Fixnum - hex 0b για δυαδική -0b10_1010 » -42 # Fixnum – bin (negated) Σημαντικό: Όπως και όλα τα άλλα πράγματα στην Ruby, οι αριθμοί είναι ΑΝΤΙΚΕΙΜΕΝΑ! Π.χ.: Αν θελαμε να εκτελέσουμε την εντολή abs(-15) στην C++ π.χ. στην Ruby είναι -15.abs Συντακτικοί κανόνες - Αριθμοί (2)
  • 36. Συντακτικοί κανόνες - Συμβολοσειρές (1) Τρόποι για εισαγωγή strings: “ ...” : υποστήριξη για χαρακτήρες διαφυγής (όπως \n για νέα γραμμή κλπ...), μεταβλητών, καθώς και των #{} #{} εάν μέσα σε ένα string χρησιμοποιήσουμε αυτό μπορούμε να πάρουμε την τιμή μίας έκφρασης π.χ.: #{num1 + num2} μας επιστρέφει το άθροισμα των num1 και num2. Μπορούμε να έχουμε και πολύ πιο περίπλοκες εκφράσεις όπως #{do ... end} κλπ...) &quot;Interpolated #{‘ foo’ * 3 }&quot; » &quot;Interpolated foo foo foo &quot; '... ' : υποστηρίζονται ελάχιστοι χαρακτήρες διαφυγής. Έτσι , π.χ. το \n θα γραφεί μέσα στο string σαν \n και όχι σαν νέα γραμμή. ’ Simple #{ ‘foo’ * 5 }’ » &quot;Simple #{ ‘foo’ * 5 } ” %q{το κειμενο μας} και %Q{το κείμενό μας} : ίδια χρήση με τα '...' και “...” αντίστοιχα Π.χ.: Σημαντικό! Μπορούμε αντί για {} να χρησιμοποιήσουμε [] , () ή <> καθώς και οποιονδήποτε άλλο χαρακτήρα μέχρι αυτός να επαναληφθεί! π.χ. %Q!το κειμενο μας...! Εδώ το “!” παίζει τον ρόλο του “περιοριστή”
  • 37. Συντακτικοί κανόνες - Ονοματολογία Μεταβλητές και Μέθοδοι counter, my_method κ.λ.π... Μεταβλητές κλάσης: Με 2 @@: @@number_of_instances , @@table ... Μεταβλητές στιγμιοτύπων Έχουν μπροστά από το όνομά τους το “παπάκι”: @name, @maximum ... Σταθερές Το πρώτο γράμμα ΑΠΑΡΑΙΤΗΤΑ κεφαλαίο! : Type, KEY, R2D2 ... Global μεταβλητες: Με το σύμβολο $ $global, $count Σύμβολα : Με το σύμβολο : : name
  • 38. Συντακτικοί κανόνες – Ονοματολογία (2) Οι μεταβλητές και οι μέθοδοι συνηθίζεται να γράφονται με την μέθοδο του snake_notation Οι κλάσεις γράφονται με την μέθοδο του CamelNotation Οι σταθερές γράφονται με όλα τα γράμματα κεφαλαία
  • 39. Βασικοί Τύποι (έτσι για αρχή...) Συλλογές Δεδομένων Πίνακες Ευρετήρια Εύρη Συμβολοσειρές Κανονικές Εκφράσεις
  • 40. Συλλογές Δεδομένων Μία γραμμική διάταξη στοιχείων που προσπελαύνονται μέσω: Του ονόματος του πίνακα Της αριθμητικής θέσης του στοιχείου μέσα σε αυτόν ( index) Π.χ.: my_array = [1,5,10,15] my_array[3] » 1 5 Ένα σύνολο που αντιστοιχίζει: κλειδιά αναζήτησης ( keys ) στα στοιχεία του ( values) Π.χ.: my_hash = {1=>”a”, 2=>”b”} my_hash[1] » “a” Πίνακες ( Arrays) Ευρετήρια (Hashes)
  • 41. Συλλογές Δεδομένων – Πίνακες Δημιουργία ενός πίνακα : a = [1,2,3,4] a[2] >> 3 b = [‘nikos’,’giannis’] b[0] >> nikos a = Array.new a << ‘some’ << ‘things’ << ‘appended’ a[2] >> appended a[0] = 3 a >> [3,”things”,”appended”] a = Array.new(5,2) a >> [2,2,2,2,2] ΠΡΟΣΟΧΗ! a = Array.new(2,’Me’) a >> [“Me”,”Me”] a[0] << ‘ n you’ a >> [“Me n you”, “Me n you”]
  • 42. Συλλογές Δεδομένων – Πίνακες (2) stack = Array.new stack.push(‘a’) stack.push(‘b’) stack.push(‘c’) stack >> [“a”,”b”,”c”] stack.pop >> “c” stack.pop >> “b” stack.pop >> “a” stack.pop >> nil (null) stack >> [] queue = Array.new queue.push(‘a’).push(‘b’).push(‘c’) queue >> [“a”,”b”,”c”] queue.shift >> “a” queue.shift >> “b” queue.shift >> “c” queue.shift >> nil queue >> [] Οι πίνακες σαν στοίβες (!) Οι πίνακες σαν ουρές (! 2 )
  • 43. Συλλογές Δεδομένων – Πίνακες (3) Άλλα ενδιαφέροντα και χρηστικά: Ως γνωστόν , η αρίθμηση ξεκινάει από το 0. Έτσι το τελευταίο στοιχείο ενός πίνακα a θα είναι το a[a.length-1] a = [‘nikos’, ‘giannis’, ‘kostas’, ‘xristos’] a[a.length-1] >> “xristos” a[10] >> nil . . // Καμιά ιδέα τι θα συμβεί άμα δώσουμε a[-1] ; a[-1] >> “xristos” (!) // Απλά αρχίζει και μετράει από το τέλος! // Ουσιαστικά index = (a.length+index) mod a.length, για index < 0 Τι συμβαίνει όμως όταν δώσουμε αρνητικές τιμές? Ας δούμε ένα παράδειγμα…
  • 44. Συλλογές Δεδομένων – Ευρετήρια Παράδειγμα Έστω ότι έχουμε τον εξής (απλοϊκό) κατάλογο για login : login_acc mi49 Bourlakos Ioannis nikosd Dimitrakopoulos Nikolaos kk24 Kavouras Konstantinos bai21 Vourliotou Anna tst05062 Piskos Stergios
  • 45. Συλλογές Δεδομένων – Ευρετήρια (2) login_acc = { &quot;mi49” => &quot;Bourlakos Ioannis&quot;, &quot;nikosd” => &quot; Dimitrakopoulos Nikolaos&quot;, &quot;kk24&quot; => &quot;Kavouras Konstantinos&quot;, &quot;bai21&quot; => &quot;Vourliotou Anna&quot;, &quot;tst05062” => &quot;Piskos Stergios&quot; } Για να πάρουμε μια τιμή, αρκεί να παράσχουμε το όνομα του κλειδιού που μας ενδιαφέρει . kostas = login_acc[“kk24”] Για να εισάγουμε μια νέα τιμή συνήθως δίνουμε και ένα νέο κλειδί. login_acc[“noob”] = “Gates Bill” Αν εισάγουμε υπάρχον κλειδί τότε η υπάρχουσα τιμή θα αντικατασταθεί από την καινούρια. Ορισμός Χρήση
  • 46. Συλλογές Δεδομένων – Ευρετήρια (3) Παράδειγμα Ένα (τετριμμένο) πρόγραμμα ελέγχου σύνδεσης χρήστη: puts &quot;Enter your username:&quot; username = gets name = login_acc[username[0..-2]] # :-) name = &quot;Unknown&quot; if !name puts &quot;Hello Mr/Mrs #{name}&quot;
  • 47. Συλλογές Δεδομένων – Ευρετήρια (4) Γιατί επιλέγω ευρετήρια αντί πίνακες; Δε με νοιάζει η διάταξη των τιμών Μπορώ ως κλειδί ή/και τιμή να εισάγω οποιοδήποτε αντικείμενο. Ευκολότερη (και γρηγορότερη) αναζήτηση Για να βρω την τιμή που θέλω, αρκεί να δώσω το κλειδί. Αν υπάρχει θα επιστραφεί, αλλιώς nil.
  • 48. Βασικοί Τύποι – Εύρη ( Ranges) Ας προσπαθήσουμε να διαβάσουμε το εξής: 1..100 Σχεδόν κάθε άνθρωπος, ανεξάρτητα από την γλώσσα που μιλάει θα μπορούσε να φανταστεί ότι είναι μία συντόμευση του «Από 1 … μέχρι 100», δεν νομίζετε? Γιατί στην Ruby να είναι διαφορετικά? 
  • 49. Βασικοί Τύποι – Εύρη (2) Τα εύρη σαν ακολουθίες τιμών (αριθμών αλλά και συμβολοσειρών) Παράδειγμα: a = (1..5).to_a // Το to_a σημαίνει απλά « to array » b = (“a”..”z”).to_a c = (“a”…”z”).to_a a >> [1,2,3,4,5] b >> [“a”,”b”,”c”,”d”,……,”z”] c >> [“a”,”b”,…..,”y”] // Χρησιμοποιώντας τις 3 τελείες (…) λέμε στην Ruby να μην λάβει υπ’όψιν της το τελευταίο στοιχείο
  • 50. Βασικοί Τύποι – Εύρη (3) Τα εύρη σαν διαστήματα… Μπορεί να θέλουμε να ελέγξουμε , εάν κάτι είναι μέσα σε ένα συγκεκριμένο εύρος τιμών … Παραδείγματα: (1..10) === 5 >> true // Είναι σαν να ρωτάμε: «Το 5, είναι ανάμεσα στο 1 και στο 10?» (1..10) === 15 >> false (1..10) === 3.14159 >> true ( ‘a’..’j’) === ‘c’ >> true και ούτω καθ’ εξής…
  • 51. Βασικοί Τύποι – Εύρη (4) Θα δούμε στην συνέχεια, πώς τα εύρη χρησιμοποιούνται και βοηθάνε πάρα πολύ στις συνθήκες Δηλαδή σε δομές ελέγχου, όπως: If while for κ.λ.π.
  • 52. Βασικοί Τύποι - String Συμβολοσειρά (string): είναι ακολουθία (πίνακας) από χαρακτήρες 8-bit ( ASCII) . Μια συμβολοσειρά στιγμιοτυπείται από την κλάση String puts “rofl”.class >> String Η κλάση String περιέχει πολλές λειτουργικότητες για τα strings, εν είδει μεθόδων .
  • 53. Βασικοί Τύποι - String name = “Kleoboulos” name[2] >> 101 ;-) name[5..8] >> “oulo” name2 = name name2[4] = “v” name >> “Kleovoulos” name.gsub “ou”,”u” >> “Kleovulos” name.reverse >> “soluovoelK” name.upcase >> “KLEOVOULOS” name >> “Kleovoulos” κλπ
  • 54. Βασικοί Τύποι - String Συμπέρασμα: η χρήση τελεστών μεταβάλλει ένα στιγμιότυπο string αντίθετα, η κλήση μεθόδων επιστρέφει ένα νέο string με την εκάστοτε αλλαγή εκτός αν χρησιμοποιήσουμε το θαυμαστικό (!) στο τέλος του ονόματος της μεθόδου Π.χ. name.reverse!
  • 55. Έλεγχος ροής - Αναθέσεις μεταβλητών (1) Απλές όπως έχουμε ήδη δει: a = 15 b = ‘nikos’ c = “#{b} is the best!” Παράλληλες αναθέσεις: a,b = 15,”nikos” a >> 15 b >> “nikos” a,b = b,a a >> “nikos” b >> 15 ΠΡΟΣΟΧΗ! a = ‘test’ b = a b >> “test” b[3] = ‘o’ a >> “teso” // Η ανάθεση γίνεται με αναφορά και όχι με τιμή! c = a.dup // έτσι αντιγράφουμε την τιμή του a και όχι το a ( συγκεκριμένα εδώ για Strings)
  • 56. Έλεγχος ροής - Αναθέσεις μεταβλητών (2) «Αλυσιδωτές» αναθέσεις: a = b = 4 a + b >> 8 Συντομεύσεις: a += 2 a >> 6 «Σπάσιμο» πινάκων: array = [1,2] a,b = *array a >> 1 b >> 2
  • 57. Έλεγχος Ροής – Συνθήκες (1) if if (1 + 1 == 2) &quot;Like in school.&quot; else &quot;What a surprise!&quot; end Προφανώς: >> “Like in school” Χμ… Ας δούμε κάτι πιο ενδιαφέρον..: str = “ βαρετό είναι αυτό… ” str = “ Ωπ! Κάτι ενδιαφέρον! ” if (1 +1 == 2) str >> “ Ωπ! Κάτι ενδιαφέρον! ” unless unless (1 + 1 == 2) &quot;Like in school.&quot; else &quot;What a surprise!&quot; end Το ακριβώς αντίθετο της if, δηλαδή: >> “What a surprise!” Αυτό ισχύει για όλες τις συνθήκες όπως θα δούμε στην συνέχεια! Α! Και κάτι ακόμα…: (1 + 1 == 2) ? ‘Working’ : ‘Defect’ Αποτέλεσμα >> ‘Working’ Το αποτέλεσμα για αληθείς τιμές Το αποτέλεσμα για ψευδείς τιμές
  • 58. Έλεγχος ροής – Συνθήκες (2) puts case spam_probability = rand(100) when 0..10 then &quot;Lowest probability: “ + spam_probability.to_s when 10..50 then &quot;Low probability: “ + spam_probability.to_s when 50..90 then &quot;High probability: “ + spam_probability.to_s when 90..100 then &quot;Highest probability: “ + spam_probability.to_s end case user = gets case user[0..-2].downcase when “monica” then puts “Hello cutie…” when “nikos”,”giannis” then puts “Hello Master” else puts “Hello stanger” end Μετατροπή όλων των χαρακτήρων σε πεζά Αφαίρεση του χαρακτήρα διαφυγής \n που διαβάζει η gets. Εναλλακτικά θα μπορούσαμε να χρησιμοποιήσουμε: user.chomp Ανάγνωση από το πληκτρολόγιο Η case εδώ χρησιμοποιείται σαν όρισμα στην puts Η random(100) παράγει έναν τυχαίο αριθμό μέχρι το 100
  • 59. Έλεγχος ροής – Συνθήκες ( 3 ) def is_true(value) value ? true : false end is_true(false) » false is_true(nil) » false is_true(true) » true is_true(1) » true is_true(0) » true is_true([0,1,2]) » true is_true(’a’..’z’) » true is_true(”) » true is_true(:a_symbol) » true Ας δούμε τι είναι true και τι false σε μία συνθήκη…
  • 60. Έλεγχος ροής – Βρόχοι (1) i = 1 while (i < 100) i *= 2 end i » 128 (i » 128) begin i *= 2 end while (i < 100) i » 256 i = 1 loop do break i if (i >= 4000) i *= 2 end » 4096 i » 4096 r = [] for i in 0..7 next if i % 2 == 0 r << i end » 0..7 r » [1, 3, 5, 7] Πηγαίνει στην επόμενη επανάληψη του βρόγχου εάν ισχύει η συνθήκη The classic (almost) way …
  • 61. Έλεγχος ροής – Βρόχοι ( 2 ) i = 1 i *= 2 while (i < 100) i » 128 The ruby way … (i » 128) i *= 2 until (i >= 1000) i » 1024 (i » 1024) 4.times do i *= 2 end » 4 i » 16384 Και πώς θα σας φαινόταν αυτό…? 3.times { print &quot;X &quot; } Η αυτό? 1.upto(5) {|i| print i, &quot; &quot; } 99.downto(95) {|i| print i, &quot; &quot; } Και αυτό? Αυτό? 50.step(80, 5) {|i| print i, &quot; &quot; } X X X X X X 1 2 3 4 5 X X X 1 2 3 4 5 99 98 97 96 95 X X X 1 2 3 4 5 99 98 97 96 95 50 55 60 65 70 75 80 Iterations
  • 62. Μπλοκ κώδικα (1) Μία συνάρτηση μπορεί να παίρνει σαν όρισμα ένα μπλοκ κώδικα Ένα μπλοκ κώδικα αποτελείται από εντολές Η κληθείσα συνάρτηση εκτελεί τον κώδικα του μπλοκ σε ένα συγκεκριμένο σημείο που έχουμε ορίσει εμείς def three_times yield yield yield end three_times { puts &quot;Hello&quot; } Παράγει στην έξοδο Hello Hello Hello
  • 63. Μπλοκ κώδικα ( 2 ) Μέσα στην μέθοδο three_times() το yield αντικαθίσταται με τον κώδικα που δίνουμε ανάμεσα στα {}. def three_times yield yield yield end three_times { puts &quot;Hello&quot; } def three_times puts “Hello” puts “Hello” puts “Hello” end Έτσι, ουσιαστικά είναι σαν η μέθοδος three_times() να γίνεται ως εξής:
  • 64. Μπλοκ κώδικα & Iterations ( 3 ) Δίπλα στο yield μπορούν να αναφέρονται παραπάνω από μία μεταβλητές def fib_up_to(max) i1, i2 = 1, 1 while i1 <= max yield i1 i1, i2 = i2, i1+i2 end end //Και πως θα το καλέσουμε? fib_up_to(1000) {|f| print f, &quot; &quot; } Παράγει στην έξοδο 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 ( Ακολουθία Fibonacci) Ουσιαστικά η τιμή του i1 μεταβιβάζεται στο f, που έχει οριστεί μέσα στο μπλοκ, ανάμεσα στα | | . Έτσι, στο παράδειγμα αυτό, οι τιμές του i1 κατά την διάρκεια της επανάληψης (iterate σημαίνει «επανέλαβε»), περνάνε στην μεταβλητή f του μπλοκ, και τυπώνονται σε κάθε επανάληψη Δίπλα στο yield μπορούμε να δηλώσουμε μεταβλητές Τι αποτέλεσμα θα έχει αυτό? Ας δούμε το παράδειγμα…
  • 65. Μπλοκ κώδικα & Iterations (4) Τώρα που είδαμε τι είναι τα μπλοκ κώδικα και τα iterations ας δούμε κάποια χρήσιμα iterators της Ruby: [’i’, ’am’, ’a’, ’banana’].each do | entry | print entry, ’ ’ end το do … end μπορεί να αντικαταστήσει τα {…} i am a banana fac = 1 » 1 1.upto(5) do | i | fac *= i end » 1 fac » 120 a = (“a”..”e”).to_a » [“a”,”b”,”c”, “d”, “e”] a.map { | entry | entry + “!” } » [“a!”,”b!”,”c!”, “d!”, “e!”] a » [“a”,”b”,”c”, “d”, “e”] a » [“a”,”b”,”c”, “d”, “e”] a.inject { | sequence, letter | sequence + letter } » “abcde” a » [“a”,”b”,”c”, “d”, “e”]
  • 66. Μπλοκ κώδικα & Iterations ( 5 ) Πότε βάζουμε { || … } και πότε do || … end ? Κατά σύμβαση συνηθίζεται: do || … end : Όταν αυτό που μας ενδιαφέρει κυρίως είναι το αποτέλεσμα των εντολών που έχουμε εισάγει στο μπλοκ. Π.χ.: { || … } : Όταν αυτό που κυρίως μας ενδιαφέρει είναι η τιμή που επιστρέφεται από την επανάληψη. Π.χ.: [1,2,3,4,5].each do | e | puts e end [1,2,3,4,5].map { | e | e * e } » [1, 4, 9, 16, 25]
  • 67. Βασικοί Τύποι - Regexp Κανονική έκφραση (regular expression) : είναι o συνοπτικός ορισμός ομοιότητας των στοιχείων ενός συνόλου από strings. Πρακτικά, μια κανονική έκφραση καθορίζει αν ένα string επαληθεύεται από ένα συγκεκριμένο πρότυπο , ως ακολουθία χαρακτήρων . Στην ουσία, λοιπόν, μιλάμε για είδη συνθηκών. Στη Ruby, μια κανονική έκφραση είναι στιγμιότυπο της κλάσης Regexp.
  • 68. Βασικοί Τύποι - Regexp Σύμβολο (symbol) Έστω το σύμβολο a. Αν το string περιλαμβάνει το σύμβολο a τότε ανήκει στο σύνολο (επαληθεύεται). “ mississippi” =~ /s/ >> 2 “ mississippi” =~ /a/ >> nil Ο χαρακτήρας . επαληθεύει οποιοδήποτε σύμβολο Εναλλαγή (alternation) Έστω δύο (ή περισσότερες) κανονικές εκφράσεις Αν το string επαληθεύεται από μία εκ των όσων , τότε επαληθεύεται από την εναλλαγή “ mississippi” =~ /[dsia]/ >> 1
  • 69. Βασικοί Τύποι - Regexp Συνένωση (concatenation) Έστω δύο (ή περισσότερες) κανονικές εκφράσεις Αν ένα string επαληθεύεται από την αλληλουχία των εκφράσεων, τότε επαληθεύεται από τη συνένωση. “ mississippi” =~ /i[sp][sp]/ >> 1 “ mississippi” =~ /i[sp]i/ >> nil Επανάληψη (repetition – Kleene closure) Έστω μια κανονική έκφραση. Αν επαληθεύεται 0 ή περισσότερες φορές η έκφραση στο string τότε επαληθεύεται από την επανάληψη. “ mississippi” =~ /(si)*/ >> 0 “ mississippi” =~ /(is)*s/ >> 1
  • 70. Βασικοί Τύποι - Regexp Πρόθεμα (prefix) Έστω μια έκφραση. Αν αυτή επαληθεύει την αρχή του string , τότε το string επαληθεύεται από το πρόθεμα . “ mississippi” =~ /^mis/ >> 0 “ mississippi” =~ /^mip/ >> nil Επίθεμα (suffix) Έστω μια έκφραση. Αν αυτή επαληθεύει το τέλος του string , τότε επαληθεύεται από το επίθεμα . “ mississippi” =~ /sppi$/ >> nil “ mississippi” =~ /(p)*i$/ >> 8
  • 71. Βασικοί Τύποι - Regexp Η προτεραιότητα μεταξύ των επαληθεύσεων είναι: Επανάληψη Συνένωση Εναλλαγή Πρόθεμα / Επίθεμα Σύμβολο Αν θέλουμε να εισάγουμε κάποιον από τους χαρακτήρες σε μια κανονική έκφραση: . | ( ) [ ] { } + \ ^ $ * ? τότε τους εισάγουμε προθέτοντας το χαρακτήρα διαφυγής \ (backslash).
  • 72. Μέχρι την επόμενη φορά... Ερωτήσεις & Απαντήσεις
  • 73. Θέματα που δεν καλύφθηκαν… Threads Χειρισμός εξαιρέσεων ( Exceptions / Exception Handling) I/O Υπερφόρτωση τελεστών Mixins ( αντί για πολλαπλή κληρονομικότητα – αντίστοιχο με τα interfaces της Java) Modules ( αντίστοιχο με τα packages της Java) Προέκταση υπαρχουσών κλάσεων Unit Testing Βιβλιοθήκες / bindings για ανάπτυξη GUI Υπάρχει ενδιαφέρον για επόμενο σεμινάριο???
  • 74. Ιδέες και σκέψεις για δράσεις… Δημιουργία υποστηρικτικού υλικού (παρουσιάσεις, tutorials, how-to’s, κείμενα κ.λ.π.) Δημιουργία site / ruby-hellug (Hellenic User Group) Διοργάνωση 2 ου σεμιναρίου για την Ruby με τα θέματα που αναφέρθηκαν πριν Διοργάνωση σεμιναρίου με θέμα το περιβάλλον ανάπτυξης web εφαρμογών Ruby On Rails Συμμετάσχετε και εσείς!
  • 75. Υλικό και νέα σχετικά με την Ruby στο διαδίκτυο… http://www.ruby-lang.org/en/ Η επίσημη ιστοσελίδα της Ruby. Περιέχει ενημερωτικό υλικό, νέα, τα εργαλεία για την Ruby (interpreter, ri, gems κλπ…) καθώς και εκπαιδευτικό υλικό και wiki http://www.ruby-forum.com/ Λίστες ταχυδρομείου και forums για την Ruby http://wiki.rubygarden.org/Ruby Καταπληκτικό wiki με υλικό και πληροφορίες σχετικά με οτιδήποτε έχει να κάνει με την Ruby ( από κοινότητες χρηστών μέχρι FAQ και Howto’s) http://www.ruby-doc.org/ Όπως λέει και το όνομα της σελίδας documentation και υποστηρικτικό υλικό http://www.rubyinside.com/ Νέα αλλά και tutorials σχετικά με την Ruby http://rubycorner.com/ News aggregation από 260++ blogs, forums, mailing lists κ.λ.π.!
  • 76. Βιβλιογραφία (1) “ Programming Ruby: The Pragmatic Programmers' Guide, Second Edition” D. Thomas The Pragmatic Programmers, LLC, 2005 “ Design Patterns: Elements of Reusable Object-Oriented Software” E. Gamma, R. Helm, R. Johnson, J. Vlissides Addison-Wesley, 1995
  • 77. Βιβλιογραφία (2) http://www.ruby-doc.org/ <Various Authors> “ 30 Second Rule” and James Britt, 2006 “ Ruby Course: an immersive programming course” B. Schroeder Brian Schroeder, 2004-2006
  • 78. Άδεια Χρήσης Ελεύθερης Τεκμηρίωσης GNU http://www.fsf.org/licensing/licenses/fdl.txt
  • 79. Σας ευχαριστούμε για την παρουσία και την προσοχή σας. Μας τιμάτε. Ν. Δημητρακόπουλος, Γ. Μπουρλάκος