introduction to ruby [Εισαγωγή στην ruby]

79
ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΙΣΑΓΩΓΗ ΣΤΗΝ RUBY RUBY Νίκος Δημητρακόπουλος, Γιάννης Μπουρλάκος [email protected] [email protected] Πανεπιστήμιο Πελοποννήσου Association for Computing Machinery Φοιτητικό Παράρτημα ACM Παν. Πελοποννήσου Τρι 12 Δεκ 2006 Έκδοση 1.0.1

Upload: nikos-dimitrakopoulos

Post on 26-Jun-2015

4.096 views

Category:

Technology


3 download

DESCRIPTION

Μία περιεκτική εισαγωγή στη Ruby γραμμένη εξ'ολοκλήρου στα ελληνικά. Έκδοση 1.0.1, 12 Δεκ 2006 Δημητρακόπουλος Νικόλαος, Μπουρλάκος Ιωάννης Άδεια Χρήσης Ελεύθερης Τεκμηρίωσης GNU Στα πλαίσια του ACM Student Chapter του Πανεπιστημίου Πελοποννήσου

TRANSCRIPT

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

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΙΣΑΓΩΓΗ ΣΤΗΝ RUBYRUBY

Νίκος Δημητρακόπουλος, Γιάννης Μπουρλάκος [email protected] [email protected]

Πανεπιστήμιο ΠελοποννήσουAssociation for Computing MachineryΦοιτητικό Παράρτημα ACM Παν. Πελοποννήσου

Τρι 12 Δεκ 2006

Έκδοση 1.0.1

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

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 "GNU Free Documentation License".

Κατοχύρωση Πνευμ. Ιδιοκτησίας 2006 Δημητρακόπουλος Νικόλαος, Μπουρλάκος Ιωάννης

Παρέχεται η άδεια για αντιγραφή, δημοσίευση ή/και μεταποίηση αυτού του εγγράφου υπό τους όρους της Άδειας Χρήσης Ελεύθερης Τεκμηρίωσης GNU, Έκδοση 1.2 ή μεταγενέστερης έκδοσης δημοσιευμένης από το Free Software Foundation· δεν περιλαμβάνονται Αμετάβλητα Αποσπάσματα, Κείμενο Εμπροσθοφύλλου και Κείμενο Οπισθοφύλλου. Ένα αντίγραφο της Άδειας Χρήσης περιλαμβάνεται στο κεφάλαιο με τίτλο “Άδεια Χρήσης Ελεύθερης Τεκμηρίωσης GNU".

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

Γιατί να μας παρακολουθήσετε ...3

Η δύναμη της Ruby είναι η απλότητα και η περιεκτικότητα του κώδικά της

Είναι μια γλώσσα που υπάγεται στο πλέον διαδεδομένο σχεδιαστικό μοντέλο, το αντικειμενοστρεφές

Είναι μια γλώσσα που μπορεί να βελτιώσει την παραγωγικότητά σας, ως εκ τούτου...

Άλλωστε, τη γνωρίσαμε, ενθουσιαστήκαμε και θέλουμε να μοιραστούμε τον ενθουσιασμό μας!

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

...και να χρησιμοποιήσετε τη Ruby!4

Γιατί άμα αρέσει και σε εσάς, όπως και στον περισσότερο κόσμο που την γνώρισε, τότε σίγουρα θα ξεχάσετε την PHP, την Perl και την Python για τις “scripting” ανάγκες σας

Γιατί αυτή τη στιγμή έχει μία τρομερή ώθηση που οφείλεται στο Rails (ή αλλιώς Ruby On Rails Framework). Το Rails είναι ένα περιβάλλον ανάπτυξης web εφαρμογών

που ελαχιστοποιεί τον χρόνο, τον κόπο και τις γραμμές κώδικα που χρειάζεται για τον σχεδιασμό και την υλοποίηση μίας web εφαρμογής

Υποστηρίζει όλες τις «τεχνολογίες αιχμής» και τάσεις που κυριαρχούν αυτή τη στιγμή στο web (XML, feeds, AJAX κ.λ.π.)

Γιατί είναι “trendy” αυτή τη στιγμή, με ότι καλό και ότι κακό αυτό συνεπάγεται… Έτσι, και αυτή και κυρίως το Rails, συμπεριλαμβάνονται στο buzzword που λέγεται Web2.0.

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

Τι δεν είναι η Ruby και ποια είναι τα αρνητικά της…

5

Η Ruby μέχρι πριν λίγο καιρό δεν είχε την διάδοση που έχει τώρα. Αυτό έχει ως αποτέλεσμα διάφορα αρνητικά: Τεκμηρίωση

Το documentation για το API που υπάρχει αυτή τη στιγμή, αλλά και τα περισσότερα κείμενα του επίσημου site, δεν είναι και ότι καλύτερο…

Βιβλιογραφία Μέχρι στιγμής υπάρχει περιορισμένη βιβλιογραφία για την Ruby (και

για το Rails). Αυτό βέβαια πρόκειται να αλλάξει σύντομα, αφού για το διάστημα Νοέμβριος 2006 – Απρίλιος 2007 είναι προγραμματισμένα για έκδοση πάνω από 8 βιβλία, από διάφορους εκδοτικούς οίκους

Απόδοση Σε θέματα απόδοσης είναι αρκετά πίσω σε σχέση με άλλες γλώσσες

(και scripting αλλά και compiled). Αυτό δικαιολογείται αφού αφενός, τώρα ΘΑ μπει στην έκδοση 2 (όταν η PHP έχει φτάσει την 5, και η Java αισίως την 6) και αφετέρου αφού δεν είχε σχεδιαστεί με πρωταρχικό στόχο την απόδοση, αλλά την ΕΥΧΡΗΣΤΙΑ!

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

Εξελίξεις...6

Στην βιβλιογραφία: Όπως αναφέρθηκε, σύντομα οι διαθέσιμοι τίτλοι σχετικά με την Ruby

θα πολλαπλασιαστούν, με ότι θετικό αυτό έχει αλλά και με ότι αυτό σημαίνει για μία γλώσσα / τεχνολογία…

Στην απόδοση: Όλες οι προσπάθειες που γίνονται από αυτούς που συμμετέχουν στην

ανάπτυξη της γλώσσας εστιάζονται σε θέματα απόδοσης (τουλάχιστον για την επερχόμενη έκδοση 2). Αυτό σημαίνει ότι αναμένεται εκθετική βελτίωση σε θέματα απόδοσης…

Στην υποστήριξη: Οι μεγάλες εταιρίες αρχίζουν να δείχνουν ενδιαφέρον για αυτήν… Η Sun, προ λίγων ημερών προσέλαβε τον προγραμματιστή που ήταν

υπεύθυνος για την JRuby (που θα δούμε τι είναι στην συνέχεια…) Η ΙΒΜ έχει αρχίσει να δείχνει ενδιαφέρον για το Rails, αλλά και την

Ruby

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

Βοηθητικά εργαλεία της Ruby - Συγγραφή κώδικα

Επεξεργαστές κειμένου όπως: xemacs vim freeride (IDE εργαλείο, γραμμένο εξ’ ολοκλήρου στην

Ruby) jedit ... όποιος άλλος σας βολεύει. Για κάθε 10

προγραμματιστές υπάρχουν 15 αγαπημένοι επεξεργαστές κειμένου

7

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

Βοηθητικά εργαλεία της Ruby - Περιληπτικά

irb (Interactive Ruby):Διαδραστικός μεταφραστής (interpreter) της Ruby

ruby (Ruby interpreter):Ο κλασικός μεταφραστής για την Ruby

ri (Ruby Information):Εργαλείο για την αναζήτηση πληροφοριών σχετικά με

μία κλάση, μέθοδο κ.λ.π.

8

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

Βοηθητικά εργαλεία της Ruby - Εκτέλεση (interpreters)

Οι interpreters (διερμηνείς) προφανώς είναι απαραίτητοι για την εκτέλεση των scripts μας. Έτσι για να εκτελεστεί ένα script πρέπει να έχει στην αρχή του : #!/usr/bin/ruby –w (Unix-based)

Αλλιώς μπορούμε απλά να εκτελέσουμε ruby -w όνομα_αρχείου.rb

Άλλος τρόπος (κυρίως για δοκιμαστικούς λόγους) είναι ο “διαδραστικός διερμηνέας”, ή αλλιώς στα ελληνικά Interactive Ruby (irb) . Πολλές φορές αναφέρεται και ως ruby shell.

9

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

Βοηθητικά εργαλεία της Ruby – Εκτέλεση (2)

JRuby – Ένας εναλλακτικός interpreter γραμμένος σε Java! : O JRuby είναι μία υλοποίηση του Ruby Interpreter,

γραμμένος εξ'ολοκλήρου σε Java και αναπτύσεται από την ομάδα JRuby.

Είναι ανοιχτού κώδικα (όπως και η Ruby) κάτω από την γνωστή LGPL/GPL άδεια.

Είναι ενοποιημένο (!) με την Java έτσι ώστε να παρέχει τόσο υποστήριξη για Java κλάσεις μέσα στα Ruby scripts αλλά και υποστήριξη του Ruby interpreter μέσα σε Java εφαρμογές!!!

10

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

Βοηθητικά εργαλεία της Ruby - Τεκμηρίωση

Για αναζήτηση μέσα στο API της ruby χρησιμοποιούμε την εντολή ri (Ruby Information), στην κονσόλα – τερματικό του υπολογιστή μας.

Είναι ένα πολύ βολικό εργαλείο για την αναζήτηση πληροφοριών σχετικά με μία κλάση, μέθοδο κ.λ.π. Π.χ.:

$ > ri String (Πληροφορίες σχετικά με την κλάση String) $ > ri Array#sort (Πληροφορίες σχετικά με την μέθοδο sort της κλάσης Array) $ > ri sort (Πληροφορίες σχετικά με την μέθοδο sort. Αν αυτή εμπεριέχεται σε

παραπάνω από μία κλάσεις, θα μας πει τα ονόματά τους ώστε να ψάξουμε με βάση το προηγούμενο παράδειγμα)

11

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

Βοηθητικά εργαλεία της Ruby - Τεκμηρίωση (2)

Επίσης, υπάρχει το rdoc Αντίστοιχο με το javadoc της java Δημιουργεί html αρχεία με το documentation για τα

modules, τις κλασεις μας κ.λ.π... Τα αρχεία που παράγονται από το rdoc είναι και αυτά

που ψάχνει το ri όταν το χρησιμοποιούμε.

12

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

Τέλος13

Απορίες...

Practice makes perfect…

...με τα βαρετά!

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

Καλό θα ήταν να θυμάστε...14

αρχές διαδικαστικού προγραμματισμού C, Pascal, Basic κλπ

τι περιλαμβάνει το αντικειμενοστρεφές μοντέλο κλάσεις, αντικείμενα, μέθοδοι κλπ γλώσσες: Java, C++, Smalltalk κλπ

Αν πάλι όχι... Θα σας δώσουμε εμείς μια “γεύση”!

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

puts(’Hello World’)puts(’Hello World’)

Hello World!15

Γεια σου και σένα!

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

def hello(name)puts('Hello ' + name)

end

hello(’Nikos’)

def hello(name)puts('Hello ' + name)

end

hello(’Nikos’)

def όνομα_συνάρτησης()... enddef όνομα_συνάρτησης()... end

Δήλωση συναρτήσεων

Για να δηλώσουμε μία συνάρτηση:16

Hello NikosHello Nikos

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

Τα ΠΑΝΤΑ είναι αντικείμενα!17

Τα μόνα πράγματα που δεν είναι αντικείμενα είναι οι δομές ελέγχου της γλώσσας - κάτι που δεν έχει κάποια άμεση συνέπεια για εμάς.

Η Ruby δεν έχει κάποιους “ιδιαίτερους τύπους” (primitive types) όπως η Java, C++ κ.λ.π.. Π.χ.: integer, float κ.λ.π…

Τα πάντα στη Ruby είναι αντικείμενα. Άρα: έχουν μια κλάση που τα δημιούργησε, έχουν πεδία ως εσωτερικά δεδομένα και πράξεις σε αυτά γίνονται μέσω επίκλησης μεθόδων.

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

Αντικειμενοστρεφές Μοντέλο18

Παράδειγμα - Διάλογος - Ρε Νίκο, ποιος έγραψε αυτή τη Ruby; - Δε θυμάμαι, μισό να δω το βιβλίο... <ο Νίκος ελέγχει το βιβλίο> - Ο Yukihiro Matsumoto!

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

Αντικειμενοστρεφές Μοντέλο19

Ένα αντικείμενο περιλαμβάνει τα δεδομένα που το ορίζουν

πεδία (fields) Κατάσταση αντικειμένου

τις πράξεις που μπορεί να εκτελέσει στα δεδομένα μέθοδοι (methods) Συμπεριφορά αντικειμένου

Ένα πρόγραμμα αποτελείται από αντικείμενα που εκτελούν μεθόδους κατ' απαίτηση άλλων αντικειμένων Μεταβίβαση μηνυμάτων (message passing).

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

Αντικειμενοστρεφές Μοντέλο20

Επεξήγηση παραδείγματος - Ρε Νίκο, ποιος έγραψε αυτή τη Ruby;

Η Ruby έχει ένα δημιουργό Ο Νίκος έχει το βιβλίο για τη Ruby Ο Γιάννης ρωτάει το Νίκο

- Δε θυμάμαι, ρε Γιάννη, μισό να δω το βιβλίο... Ο Νίκος λέει στο Γιάννη να περιμένει Το βιβλίο περιέχει το δημιουργό

<ο Νίκος ελέγχει το βιβλίο> Ο Νίκος ψάχνει την πληροφορία στο βιβλίο

- Ο Yukihiro Matsumoto! Ο Νίκος απαντά στο Γιάννη

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

Αντικειμενοστρεφές Μοντέλο21

Κλάση: ορίζει την υλοποίηση των αντικειμένων καθορίζοντας ποια είναι τα εσωτερικά δεδομένα του αντικειμένου

και την υλοποίηση των πράξεων πάνω σε αυτά.

Η κατασκευή ενός προγράμματος απαιτεί την ανάπτυξη αυτών των κλάσεων και την κατασκευή αντικειμένων (στιγμιοτύπηση –

instantiation) μέσα από αυτές.

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

Αντικειμενοστρεφές Μοντέλο22

Αντικείμενο, κλάση, στιγμιότυπο

ΑντικείμενοΑντικείμενο

ΚλάσηΚλάση ΣτιγμιότυποΣτιγμιότυπο

είναιείναι είναιείναι

παράγειπαράγει

περιγράφειπεριγράφει

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

Αντικειμενοστρεφές Μοντέλο23

Κατάσταση και συμπεριφορά

Στιγμιότυπο

Κατάσταση Συμπεριφορά

Κλάση

Κατάσταση Συμπεριφορά

Κατάσταση_Στιγμ Συμπεριφορά_Στιγμ

περιγράφει

περιγράφει

ορίζειορίζει

παράγει

παράγει

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

Αντικειμενοστρεφές Μοντέλο24

Αποστολή μηνυμάτων και απόκρυψη κατάστασης

Αντικείμενο1

Κατάσταση1 Συμπεριφορά1

Αντικείμενο 2

Συμπεριφορά2 Κατάσταση2επικαλούνταιεπικαλούνται

αποκρύπτουναποκρύπτουν

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

Αντικειμενοστρεφές Μοντέλο25

Κληρονομικότητα και πολυμορφισμός

Κλάση1 (υπερκλάση)

Κατάσταση1 Συμπεριφορά1

Κατάσταση_Στιγμ1 Συμπεριφορά_Στιγμ1

Κλάση2 (υποκλάση)

Κατάσταση1Κατάσταση2

Συμπεριφορά1Συμπεριφορά2

Κατάσταση_Στιγμ1Κατάσταση_Στιγμ2

Συμπεριφορά_Στιγμ1Συμπεριφορά_Στιγμ2

κληρονομείκληρονομεί

Στιγμιότυπο2

Κατάσταση2 Συμπεριφορά2παράγειπαράγει

είναι είδος

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

Τα ΠΑΝΤΑ είναι αντικείμενα! (2)

(5.6).round » 6(5.6).class » Float(5.6).round.class » Fixnum

(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’) » "jim jells"’abc’.gsub(’b’, ’xxx’).length » 5

’a string’.length » 8’a string’.class » String’tim tells’.gsub(’t’, ’j’) » "jim jells"’abc’.gsub(’b’, ’xxx’).length » 5

[’some’, ’things’, ’in’, ’an’, ’array’].length » 5[’some’, ’things’, ’in’, ’an’, ’array’].reverse » ["array", "an", "in", "things", "some“]

[’some’, ’things’, ’in’, ’an’, ’array’].length » 5[’some’, ’things’, ’in’, ’an’, ’array’].reverse » ["array", "an", "in", "things", "some“]

1.+(2) » 3 (είναι το ίδιο με το 1 + 2 » 3 )1.+(2) » 3 (είναι το ίδιο με το 1 + 2 » 3 )

26

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

class Person...

end

class Person...

end

Δήλωση Κλάσεων

Τα πάντα είναι αντικείμενα, είπαμε, που προέρχονται από κλάσεις

Πώς τις δηλώνουμε; Απλά:

27

Και ο κονστράκτορας? Δεν δηλώνεται με το όνομα της

κλάσης (όπως στην Java) αλλά με initialize()

class Person

end

class Person

end

def initialize()...

end

def initialize()...

end

Κλάσεις Μέθοδοι κατασκευής (constructor)

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

class Person

.

.

.end

class Person

.

.

.end

def initialize(name)@name = name

end

def initialize(name)@name = name

end

Δήλωση Κλάσεων – Πεδία και Μέθοδοι28

Τα πεδία δηλώνονται δυναμικά Δεν χρειάζεται να τα δηλώσουμε

ΠΡΙΝ τις μεθόδους ή πριν θελήσουμε να τα χρησιμοποιήσουμε

Δηλώνονται απλά με @ονομα_πεδίου

Οι μέθοδοι όπως και οι συναρτήσεις εκτός της κλάσης δηλώνονται με :

def ονομα_μεθόδου() ... end

class Person

def initialize(name) @name = name end

end

class Person

def initialize(name) @name = name end

end

def greet return "Hello, my name is " + @nameend

def greet return "Hello, my name is " + @nameend

Πεδία Μέθοδοι

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

class Matz < Persondef initialize

super(’Yukihiro Matsumoto’)end

end

class Matz < Persondef initialize

super(’Yukihiro Matsumoto’)end

end

Δήλωση Κλάσεων – Κληρονομικότητα

Δήλωση υποκλάσης: class υποκλάση < υπερκλάση ... end

29

Αναφερόμαστε στην υπερκλάση με το super()

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

Δήλωση Κλάσεων – Απόκρυψη Κατάστασης

Περιορισμός πρόσβασης στα πεδία Ανάγνωση Εγγραφή

30

class DoubleOSeven@full_name = “James Bond”@moneypennys_home = …@girlfriend = “Vesper”attr_reader :full_nameattr_writer :girlfriend

end

class DoubleOSeven@full_name = “James Bond”@moneypennys_home = …@girlfriend = “Vesper”attr_reader :full_nameattr_writer :girlfriend

end

daniel = DoubleOSeven.newputs daniel.full_namedaniel.girlfriend = “Solange”puts daniel.girlfriend // uh oh…

daniel = DoubleOSeven.newputs daniel.full_namedaniel.girlfriend = “Solange”puts daniel.girlfriend // uh oh…

attr_reader: οδηγία να κατασκευαστεί μέθοδος που επιστρέφει την τιμή του πεδίου

attr_writer: οδηγία να κατασκευαστεί μέθοδος που αλλάζει την τιμή του πεδίου

attr_accessor: και τα δύο μαζί (reader, writer)προσοχή: οι οδηγίες περιλαμβάνουν σύμβολα με το όνομα του πεδίου ( :field )

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

Δήλωση Κλάσεων – Απόκρυψη Κατάστασης

Περιορισμός ορατότητας στις μεθόδους private

ορατές μόνο στα πλαίσια του στιγμιοτύπουprivate attr_reader :account_num

protected ορατές μόνο από στιγμιότυπα της κλάσης και των

υποκλάσεωνprotected attr_writer :num_of_instances

public ορατές από όλα τα στιγμιότυπαpublic def no_aids print “Take care…” end

31

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

Συντακτικοί κανόνες32

Κατά τη συγγραφή του κώδικα κρίνεται απαραίτητο να υπάρχει ένας σταθερός τρόπος συγγραφής

Έτσι ο κώδικας: Είναι αναγνώσιμος Έχει ξεκάθαρη σημασιολογία Συντηρείται ευκολότερα

Στη Ruby…

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

puts(“Πορτοκαλάδα θέτε;”) » Πορτοκαλάδα θέτε;puts(“Πορτοκαλάδα θέτε;”) » Πορτοκαλάδα θέτε;

puts “Πορτοκαλάδα θέτε;” » Πορτοκαλάδα θέτε;puts “Πορτοκαλάδα θέτε;” » Πορτοκαλάδα θέτε;

def my_method_1puts “This is my method!”

end

def my_method_1puts “This is my method!”

end

def multi_foo(count = 3)’foo ’ * count

end

puts multi_foo » foo foo foo

def multi_foo(count = 3)’foo ’ * count

end

puts multi_foo » foo foo foo

Συντακτικοί κανόνες - Μέθοδοι

Οι μέθοδοι όπως είπαμε, ορίζονται ανάμεσα στο def και το end. 33

Μία μέθοδος ΠΑΝΤΑ επιστρέφει την τιμή της τελευταίας πράξης που εκτελέστηκε εκτός και χρησιμοποιούμε την εντολή return

Τα ορίσματα μπορούν να έχουν προκαθορισμένες τιμές

Το ίδιο και κατά την κλήση τους (!)

def my_second_method inputputs input

end

def my_second_method inputputs input

end

Οι παρενθέσεις μπορούν να παραληφθούν (!)

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

Συντακτικοί κανόνες - Αριθμοί (1)

Δύο τύποι: Ακέραιοι

Fixnum (−230 to 230 −1 ή −262 to 262−1) Bignum (εκτός των προηγούμενων ορίων)

Κινητής υποδιαστολής Σημαντικό: Όπως και όλα τα άλλα πράγματα στην Ruby, οι αριθμοί είναι

ΑΝΤΙΚΕΙΜΕΝΑ! Π.χ.: Αν θέλαμε να εκτελέσουμε την εντολή abs(-15) στην C++ π.χ. στην Ruby είναι -15.abs

Η ruby αυτομάτως παραλείπει τις κάτω παύλες (_) που βρίσκει μέσα σε αριθμούς *

34

Αυτή η τεχνική χρησιμοποιείται από πολλούς για την αναπαράσταση των «χιλιάδων» σε μεγάλους αριθμούς. Έτσι μετά από κάθε 3 ψηφία εισάγουνε μία κάτω παύλα ως εξής 13_432_899.55 . Εδώ η ruby δεν θα λάβει υπ’ όψιν της τις παύλες και θα το διαβάσει σαν κανονικό αριθμό με τιμή 13432899.55

*

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

Για ακεραίους μπορούμε να χρησιμοποιήσουμε εύκολα άλλες βάσεις αρίθμησης πέρα από την δεκαδική: 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)35

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

Συντακτικοί κανόνες - Συμβολοσειρές (1)36 Τρόποι για εισαγωγή strings:

“...” : υποστήριξη για χαρακτήρες διαφυγής (όπως \n για νέα γραμμή κλπ...), μεταβλητών, καθώς και των #{} #{} εάν μέσα σε ένα string χρησιμοποιήσουμε αυτό μπορούμε να πάρουμε την τιμή μίας

έκφρασης π.χ.: #{num1 + num2} μας επιστρέφει το άθροισμα των num1 και num2. Μπορούμε να έχουμε και πολύ πιο περίπλοκες εκφράσεις όπως #{do ... end} κλπ...)"Interpolated #{‘foo’ * 3}" » "Interpolated foo foo foo "

'... ' : υποστηρίζονται ελάχιστοι χαρακτήρες διαφυγής. Έτσι, π.χ. το \n θα γραφεί μέσα στο string σαν \n και όχι σαν νέα γραμμή.’Simple #{‘foo’ * 5}’ » "Simple #{‘foo’ * 5}”

%q{το κειμενο μας} και %Q{το κείμενό μας} : ίδια χρήση με τα '...' και “...” αντίστοιχα Π.χ.: Σημαντικό! Μπορούμε αντί για {} να χρησιμοποιήσουμε [] , () ή <> καθώς και

οποιονδήποτε άλλο χαρακτήρα μέχρι αυτός να επαναληφθεί! π.χ. %Q!το κειμενο μας...! Εδώ το “!” παίζει τον ρόλο του “περιοριστή”

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

Συντακτικοί κανόνες - Ονοματολογία

Μεταβλητές και Μέθοδοι counter, my_method κ.λ.π...

Μεταβλητές κλάσης: Με 2 @@:

@@number_of_instances , @@table ...

37

Μεταβλητές στιγμιοτύπων Έχουν μπροστά από το όνομά

τους το “παπάκι”: @name, @maximum ...

Σταθερές Το πρώτο γράμμα ΑΠΑΡΑΙΤΗΤΑ

κεφαλαίο! : Type, KEY, R2D2 ...

Global μεταβλητες: Με το σύμβολο $

$global, $count

Σύμβολα: Με το σύμβολο :

:name

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

Συντακτικοί κανόνες – Ονοματολογία (2)

Οι μεταβλητές και οι μέθοδοι συνηθίζεται να γράφονται με την μέθοδο του snake_notation

Οι κλάσεις γράφονται με την μέθοδο του CamelNotation

Οι σταθερές γράφονται με όλα τα γράμματα κεφαλαία

38

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

Βασικοί Τύποι (έτσι για αρχή...)39

Συλλογές Δεδομένων Πίνακες Ευρετήρια

Εύρη Συμβολοσειρές Κανονικές Εκφράσεις

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

Συλλογές Δεδομένων

Μία γραμμική διάταξη στοιχείων που προσπελαύνονται μέσω: Του ονόματος του πίνακα Της αριθμητικής θέσης

του στοιχείου μέσα σε αυτόν (index)

Π.χ.: my_array = [1,5,10,15]my_array[3] » 15

Ένα σύνολο που αντιστοιχίζει: κλειδιά αναζήτησης (keys) στα στοιχεία του (values)

Π.χ.:my_hash = {1=>”a”, 2=>”b”}my_hash[1] » “a”

Πίνακες (Arrays) Ευρετήρια (Hashes)

40

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

Συλλογές Δεδομένων – Πίνακες

Δημιουργία ενός πίνακα:a = [1,2,3,4]a[2] >> 3b = [‘nikos’,’giannis’]b[0] >> nikos

a = [1,2,3,4]a[2] >> 3b = [‘nikos’,’giannis’]b[0] >> nikos

a = Array.newa << ‘some’ << ‘things’ << ‘appended’a[2] >> appendeda[0] = 3a >> [3,”things”,”appended”]

a = Array.newa << ‘some’ << ‘things’ << ‘appended’a[2] >> appendeda[0] = 3a >> [3,”things”,”appended”]

a = Array.new(5,2)a >> [2,2,2,2,2]

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”]

a = Array.new(2,’Me’)a >> [“Me”,”Me”]a[0] << ‘ n you’a >> [“Me n you”, “Me n you”]

41

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

Συλλογές Δεδομένων – Πίνακες (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)

42

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

Συλλογές Δεδομένων – Πίνακες (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

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

Τι συμβαίνει όμως όταν δώσουμε αρνητικές τιμές? Ας δούμε ένα παράδειγμα…

43

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

Συλλογές Δεδομένων – Ευρετήρια

Παράδειγμα Έστω ότι έχουμε τον εξής (απλοϊκό) κατάλογο για

login:

44

login_acc

mi49 Bourlakos Ioannis

nikosd Dimitrakopoulos Nikolaos

kk24 Kavouras Konstantinos

bai21 Vourliotou Anna

tst05062 Piskos Stergios

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

Συλλογές Δεδομένων – Ευρετήρια (2)45

login_acc = { "mi49” => "Bourlakos Ioannis","nikosd” => "Dimitrakopoulos

Nikolaos","kk24" => "Kavouras Konstantinos","bai21"=> "Vourliotou Anna","tst05062” => "Piskos Stergios"}

login_acc = { "mi49” => "Bourlakos Ioannis","nikosd” => "Dimitrakopoulos

Nikolaos","kk24" => "Kavouras Konstantinos","bai21"=> "Vourliotou Anna","tst05062” => "Piskos Stergios"}

Για να πάρουμε μια τιμή, αρκεί να παράσχουμε το όνομα του κλειδιού που μας ενδιαφέρει.

kostas = login_acc[“kk24”] Για να εισάγουμε μια νέα τιμή

συνήθως δίνουμε και ένα νέο κλειδί.

login_acc[“noob”] = “Gates Bill” Αν εισάγουμε υπάρχον κλειδί

τότε η υπάρχουσα τιμή θα αντικατασταθεί από την καινούρια.

Ορισμός Χρήση

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

Συλλογές Δεδομένων – Ευρετήρια (3)46

Παράδειγμα Ένα (τετριμμένο) πρόγραμμα ελέγχου σύνδεσης

χρήστη:

puts "Enter your username:"username = getsname = login_acc[username[0..-2]] # :-)name = "Unknown" if !nameputs "Hello Mr/Mrs #{name}"

puts "Enter your username:"username = getsname = login_acc[username[0..-2]] # :-)name = "Unknown" if !nameputs "Hello Mr/Mrs #{name}"

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

Συλλογές Δεδομένων – Ευρετήρια (4)47

Γιατί επιλέγω ευρετήρια αντί πίνακες; Δε με νοιάζει η διάταξη των τιμών Μπορώ ως κλειδί ή/και τιμή να εισάγω

οποιοδήποτε αντικείμενο. Ευκολότερη (και γρηγορότερη) αναζήτηση

Για να βρω την τιμή που θέλω, αρκεί να δώσω το κλειδί.

Αν υπάρχει θα επιστραφεί, αλλιώς nil.

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

Βασικοί Τύποι – Εύρη (Ranges)

Ας προσπαθήσουμε να διαβάσουμε το εξής: 1..100

Σχεδόν κάθε άνθρωπος, ανεξάρτητα από την γλώσσα που μιλάει θα μπορούσε να φανταστεί ότι είναι μία συντόμευση του «Από 1 … μέχρι 100», δεν νομίζετε?

Γιατί στην Ruby να είναι διαφορετικά?

48

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

Βασικοί Τύποι – Εύρη (2) Τα εύρη σαν ακολουθίες τιμών (αριθμών αλλά και

συμβολοσειρών) Παράδειγμα:

a = (1..5).to_a // Το to_a σημαίνει απλά «to array»b = (“a”..”z”).to_ac = (“a”…”z”).to_a

a >> [1,2,3,4,5]b >> [“a”,”b”,”c”,”d”,……,”z”]c >> [“a”,”b”,…..,”y”] // Χρησιμοποιώντας τις 3 τελείες (…) λέμε στην Ruby να

μην λάβει υπ’όψιν της το τελευταίο στοιχείο

a = (1..5).to_a // Το to_a σημαίνει απλά «to array»b = (“a”..”z”).to_ac = (“a”…”z”).to_a

a >> [1,2,3,4,5]b >> [“a”,”b”,”c”,”d”,……,”z”]c >> [“a”,”b”,…..,”y”] // Χρησιμοποιώντας τις 3 τελείες (…) λέμε στην Ruby να

μην λάβει υπ’όψιν της το τελευταίο στοιχείο

49

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

Βασικοί Τύποι – Εύρη (3)

Τα εύρη σαν διαστήματα… Μπορεί να θέλουμε να ελέγξουμε, εάν κάτι είναι

μέσα σε ένα συγκεκριμένο εύρος τιμών… Παραδείγματα:

(1..10) === 5 >> true //Είναι σαν να ρωτάμε: «Το 5, είναι ανάμεσα στο 1 και στο 10?»

(1..10) === 15 >> false(1..10) === 3.14159 >> true(‘a’..’j’) === ‘c’ >> true

και ούτω καθ’ εξής…

(1..10) === 5 >> true //Είναι σαν να ρωτάμε: «Το 5, είναι ανάμεσα στο 1 και στο 10?»

(1..10) === 15 >> false(1..10) === 3.14159 >> true(‘a’..’j’) === ‘c’ >> true

και ούτω καθ’ εξής…

50

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

Βασικοί Τύποι – Εύρη (4)

Θα δούμε στην συνέχεια, πώς τα εύρη χρησιμοποιούνται και βοηθάνε πάρα πολύ στις συνθήκες

Δηλαδή σε δομές ελέγχου, όπως: If while for κ.λ.π.

51

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

Βασικοί Τύποι - String52

Συμβολοσειρά (string): είναι ακολουθία (πίνακας) από χαρακτήρες 8-bit (ASCII).

Μια συμβολοσειρά στιγμιοτυπείται από την κλάση String puts “rofl”.class >> String

Η κλάση String περιέχει πολλές λειτουργικότητες για τα strings, εν είδει μεθόδων.

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

Βασικοί Τύποι - 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”

κλπ

53

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

Βασικοί Τύποι - String54

Συμπέρασμα: η χρήση τελεστών μεταβάλλει ένα στιγμιότυπο

string αντίθετα, η κλήση μεθόδων επιστρέφει ένα νέο

string με την εκάστοτε αλλαγή εκτός αν χρησιμοποιήσουμε το θαυμαστικό (!) στο

τέλος του ονόματος της μεθόδου Π.χ. name.reverse!

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

Έλεγχος ροής - Αναθέσεις μεταβλητών (1)

Απλές όπως έχουμε ήδη δει:

a = 15b = ‘nikos’c = “#{b} is the best!”

a = 15b = ‘nikos’c = “#{b} is the best!”

Παράλληλες αναθέσεις:

a,b = 15,”nikos”a >> 15b >> “nikos”

a,b = b,aa >> “nikos”b >> 15

a,b = 15,”nikos”a >> 15b >> “nikos”

a,b = b,aa >> “nikos”b >> 15

ΠΡΟΣΟΧΗ!a = ‘test’b = ab >> “test”b[3] = ‘o’a >> “teso” //Η ανάθεση

γίνεται με

αναφορά και όχι με τιμή!

c = a.dup //έτσι αντιγράφουμε

την τιμή του a και όχι το a

(συγκεκριμένα εδώ για Strings)

a = ‘test’b = ab >> “test”b[3] = ‘o’a >> “teso” //Η ανάθεση

γίνεται με

αναφορά και όχι με τιμή!

c = a.dup //έτσι αντιγράφουμε

την τιμή του a και όχι το a

(συγκεκριμένα εδώ για Strings)

55

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

Έλεγχος ροής - Αναθέσεις μεταβλητών (2)

«Αλυσιδωτές» αναθέσεις:a = b = 4a + b >> 8a = b = 4a + b >> 8

Συντομεύσεις:a += 2a >> 6a += 2a >> 6

«Σπάσιμο» πινάκων:array = [1,2]a,b = *arraya >> 1b >> 2

array = [1,2]a,b = *arraya >> 1b >> 2

56

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

Έλεγχος Ροής – Συνθήκες (1)

ifif (1 + 1 == 2)

"Like in school."else

"What a surprise!"end

if (1 + 1 == 2)"Like in school."

else"What a surprise!"

end

Προφανώς: >> “Like in school”

Χμ… Ας δούμε κάτι πιο ενδιαφέρον..:

str = “βαρετό είναι αυτό…”str = “Ωπ! Κάτι ενδιαφέρον!” if (1 +1 == 2)str >> “Ωπ! Κάτι ενδιαφέρον!”

str = “βαρετό είναι αυτό…”str = “Ωπ! Κάτι ενδιαφέρον!” if (1 +1 == 2)str >> “Ωπ! Κάτι ενδιαφέρον!”

unlessunless (1 + 1 == 2)

"Like in school."else

"What a surprise!"end

unless (1 + 1 == 2)"Like in school."

else"What a surprise!"

end

Το ακριβώς αντίθετο της if, δηλαδή: >> “What a surprise!”

Αυτό ισχύει για όλες τις συνθήκες όπως θα δούμε στην συνέχεια!

Α! Και κάτι ακόμα…:

(1 + 1 == 2) ? ‘Working’ : ‘Defect’

Αποτέλεσμα >> ‘Working’

(1 + 1 == 2) ? ‘Working’ : ‘Defect’

Αποτέλεσμα >> ‘Working’

Το αποτέλεσμα για αληθείς τιμές

Το αποτέλεσμα για ψευδείς τιμές

57

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

Έλεγχος ροής – Συνθήκες (2)

puts case spam_probability = rand(100)when 0..10 then "Lowest probability: “ + spam_probability.to_swhen 10..50 then "Low probability: “ + spam_probability.to_swhen 50..90 then "High probability: “ + spam_probability.to_swhen 90..100 then "Highest probability: “ + spam_probability.to_s

end

puts case spam_probability = rand(100)when 0..10 then "Lowest probability: “ + spam_probability.to_swhen 10..50 then "Low probability: “ + spam_probability.to_swhen 50..90 then "High probability: “ + spam_probability.to_swhen 90..100 then "Highest probability: “ + spam_probability.to_s

end

caseuser = getscase user[0..-2].downcase

when “monica” then puts “Hello cutie…”when “nikos”,”giannis” then puts “Hello Master”else puts “Hello stanger”

end

user = getscase user[0..-2].downcase

when “monica” then puts “Hello cutie…”when “nikos”,”giannis” then puts “Hello Master”else puts “Hello stanger”

end

58

Μετατροπή όλων των χαρακτήρων σε πεζά

Αφαίρεση του χαρακτήρα διαφυγής \n που διαβάζει η gets. Εναλλακτικά θα μπορούσαμε

να χρησιμοποιήσουμε: user.chomp

Ανάγνωση από το πληκτρολόγιο

Η case εδώ χρησιμοποιείται σαν

όρισμα στην puts

Η random(100) παράγει έναν τυχαίο αριθμό μέχρι το 100

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

Έλεγχος ροής – Συνθήκες (3)

def is_true(value)value ? true : false

end

def is_true(value)value ? true : false

end

is_true(false) » falseis_true(nil) » falseis_true(true) » trueis_true(1) » trueis_true(0) » trueis_true([0,1,2]) » trueis_true(’a’..’z’) » trueis_true(”) » trueis_true(:a_symbol) » true

is_true(false) » falseis_true(nil) » falseis_true(true) » trueis_true(1) » trueis_true(0) » trueis_true([0,1,2]) » trueis_true(’a’..’z’) » trueis_true(”) » trueis_true(:a_symbol) » true

Ας δούμε τι είναι true και τι false σε μία συνθήκη…

59

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

Έλεγχος ροής – Βρόχοι (1)

i = 1

while (i < 100)i *= 2

end

i » 128

i = 1

while (i < 100)i *= 2

end

i » 128

(i » 128)

begini *= 2

end while (i < 100)

i » 256

(i » 128)

begini *= 2

end while (i < 100)

i » 256

i = 1

loop dobreak i if (i >= 4000)i *= 2

end » 4096

i » 4096

i = 1

loop dobreak i if (i >= 4000)i *= 2

end » 4096

i » 4096

r = []

for i in 0..7next if i % 2 == 0r << i

end » 0..7

r » [1, 3, 5, 7]

r = []

for i in 0..7next if i % 2 == 0r << i

end » 0..7

r » [1, 3, 5, 7]

Πηγαίνει στην επόμενη επανάληψη του βρόγχου

εάν ισχύει η συνθήκη

The classic (almost) way…

60

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

Έλεγχος ροής – Βρόχοι (2)

i = 1i *= 2 while (i < 100)

i » 128

i = 1i *= 2 while (i < 100)

i » 128

The ruby way…(i » 128)

i *= 2 until (i >= 1000)

i » 1024

(i » 128)

i *= 2 until (i >= 1000)

i » 1024

(i » 1024)

4.times do i *= 2 end » 4

i » 16384

(i » 1024)

4.times do i *= 2 end » 4

i » 16384

Και πώς θα σας φαινόταν αυτό…? 3.times { print "X " }3.times { print "X " }

Η αυτό? 1.upto(5) {|i| print i, " " }1.upto(5) {|i| print i, " " }

99.downto(95) {|i| print i, " " }99.downto(95) {|i| print i, " " } Και αυτό? Αυτό? 50.step(80, 5) {|i| print i, " " }50.step(80, 5) {|i| print i, " " }

X X XX X XX X X 1 2 3 4 5X X X 1 2 3 4 5X X X 1 2 3 4 5 99 98 97 96 95X X X 1 2 3 4 5 99 98 97 96 95X X X 1 2 3 4 5 99 98 97 96 95 50 55 60 65 70 75 80X X X 1 2 3 4 5 99 98 97 96 95 50 55 60 65 70 75 80

Iterations

61

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

Μπλοκ κώδικα (1)62

Μία συνάρτηση μπορεί να παίρνει σαν όρισμα ένα μπλοκ κώδικα

Ένα μπλοκ κώδικα αποτελείται από εντολές Η κληθείσα συνάρτηση εκτελεί τον κώδικα του μπλοκ

σε ένα συγκεκριμένο σημείο που έχουμε ορίσει εμείς

def three_timesyieldyieldyield

end

three_times { puts "Hello" }

def three_timesyieldyieldyield

end

three_times { puts "Hello" }

Παράγει στην έξοδο

HelloHelloHello

HelloHelloHello

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

Μπλοκ κώδικα (2)63

Μέσα στην μέθοδο three_times() το yield αντικαθίσταται με τον κώδικα που δίνουμε ανάμεσα στα {}.

def three_timesyieldyieldyield

end

three_times { puts "Hello" }

def three_timesyieldyieldyield

end

three_times { puts "Hello" }

def three_timesputs “Hello”puts “Hello”puts “Hello”

end

def three_timesputs “Hello”puts “Hello”puts “Hello”

end

Έτσι, ουσιαστικά είναι σαν η μέθοδος three_times() να γίνεται ως εξής:

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

Μπλοκ κώδικα & Iterations (3)64

Δίπλα στο yield μπορούν να αναφέρονται παραπάνω από μία μεταβλητές

def fib_up_to(max)i1, i2 = 1, 1while i1 <= max

yield i1i1, i2 = i2, i1+i2

endend//Και πως θα το καλέσουμε?fib_up_to(1000) {|f| print f, " " }

def fib_up_to(max)i1, i2 = 1, 1while i1 <= max

yield i1i1, i2 = i2, i1+i2

endend//Και πως θα το καλέσουμε?fib_up_to(1000) {|f| print f, " " }

Παράγει στην έξοδο 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 9871 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987

(Ακολουθία Fibonacci)

Ουσιαστικά η τιμή του i1 μεταβιβάζεται στο f, που έχει οριστεί μέσα στο μπλοκ, ανάμεσα στα | |.

Έτσι, στο παράδειγμα αυτό, οι τιμές του i1 κατά την διάρκεια της επανάληψης (iterate σημαίνει «επανέλαβε»), περνάνε στην μεταβλητή f του μπλοκ, και τυπώνονται σε κάθε επανάληψη

Δίπλα στο yield μπορούμε να δηλώσουμε μεταβλητές Τι αποτέλεσμα θα έχει αυτό? Ας δούμε το παράδειγμα…

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

Μπλοκ κώδικα & Iterations (4)65

Τώρα που είδαμε τι είναι τα μπλοκ κώδικα και τα iterations ας δούμε κάποια χρήσιμα iterators της Ruby:

[’i’, ’am’, ’a’, ’banana’].each do | entry | print entry, ’ ’ end[’i’, ’am’, ’a’, ’banana’].each do | entry | print entry, ’ ’ end το do … end μπορεί να αντικαταστήσει τα {…}

i am a bananai am a banana

fac = 1 » 11.upto(5) do | i | fac *= i end » 1 fac » 120

fac = 1 » 11.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”..”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”]

a » [“a”,”b”,”c”, “d”, “e”]a.inject { | sequence, letter | sequence + letter } » “abcde”a » [“a”,”b”,”c”, “d”, “e”]

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

Μπλοκ κώδικα & Iterations (5)66

Πότε βάζουμε { || … } και πότε do || … end ? Κατά σύμβαση συνηθίζεται:

do || … end : Όταν αυτό που μας ενδιαφέρει κυρίως είναι το αποτέλεσμα των εντολών

που έχουμε εισάγει στο μπλοκ. Π.χ.:

{ || … } : Όταν αυτό που κυρίως μας ενδιαφέρει είναι η τιμή που επιστρέφεται από την επανάληψη. Π.χ.:

[1,2,3,4,5].each do | e | puts e 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][1,2,3,4,5].map { | e | e * e } » [1, 4, 9, 16, 25]

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

Βασικοί Τύποι - Regexp67

Κανονική έκφραση (regular expression): είναι o συνοπτικός ορισμός ομοιότητας των στοιχείων ενός συνόλου από strings.

Πρακτικά, μια κανονική έκφραση καθορίζει αν ένα string επαληθεύεται από ένα συγκεκριμένο πρότυπο, ως ακολουθία χαρακτήρων. Στην ουσία, λοιπόν, μιλάμε για είδη συνθηκών.

Στη Ruby, μια κανονική έκφραση είναι στιγμιότυπο της κλάσης Regexp.

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

Βασικοί Τύποι - Regexp68

Σύμβολο (symbol) Έστω το σύμβολο a. Αν το string περιλαμβάνει το σύμβολο a τότε ανήκει στο

σύνολο (επαληθεύεται). “mississippi” =~ /s/ >> 2 “mississippi” =~ /a/ >> nil Ο χαρακτήρας . επαληθεύει οποιοδήποτε σύμβολο

Εναλλαγή (alternation) Έστω δύο (ή περισσότερες) κανονικές εκφράσεις Αν το string επαληθεύεται από μία εκ των όσων, τότε

επαληθεύεται από την εναλλαγή “mississippi” =~ /[dsia]/ >> 1

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

Βασικοί Τύποι - Regexp69

Συνένωση (concatenation) Έστω δύο (ή περισσότερες) κανονικές εκφράσεις Αν ένα string επαληθεύεται από την αλληλουχία των

εκφράσεων, τότε επαληθεύεται από τη συνένωση. “mississippi” =~ /i[sp][sp]/ >> 1 “mississippi” =~ /i[sp]i/ >> nil

Επανάληψη (repetition – Kleene closure) Έστω μια κανονική έκφραση. Αν επαληθεύεται 0 ή

περισσότερες φορές η έκφραση στο string τότε επαληθεύεται από την επανάληψη.

“mississippi” =~ /(si)*/ >> 0 “mississippi” =~ /(is)*s/ >> 1

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

Βασικοί Τύποι - Regexp70

Πρόθεμα (prefix) Έστω μια έκφραση. Αν αυτή επαληθεύει την αρχή του string, τότε το string

επαληθεύεται από το πρόθεμα. “mississippi” =~ /^mis/ >> 0 “mississippi” =~ /^mip/ >> nil

Επίθεμα (suffix) Έστω μια έκφραση. Αν αυτή επαληθεύει το τέλος του string, τότε επαληθεύεται

από το επίθεμα. “mississippi” =~ /sppi$/ >> nil “mississippi” =~ /(p)*i$/ >> 8

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

Βασικοί Τύποι - Regexp71

Η προτεραιότητα μεταξύ των επαληθεύσεων είναι: Επανάληψη Συνένωση Εναλλαγή Πρόθεμα / Επίθεμα Σύμβολο

Αν θέλουμε να εισάγουμε κάποιον από τους χαρακτήρες σε μια κανονική έκφραση: . | ( ) [ ] { } + \ ^ $ * ?

τότε τους εισάγουμε προθέτοντας το χαρακτήρα διαφυγής \ (backslash).

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

Μέχρι την επόμενη φορά...72

Ερωτήσεις

&

Απαντήσεις

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

Θέματα που δεν καλύφθηκαν…

Threads Χειρισμός εξαιρέσεων (Exceptions / Exception

Handling) I/O Υπερφόρτωση τελεστών Mixins (αντί για πολλαπλή κληρονομικότητα –

αντίστοιχο με τα interfaces της Java) Modules (αντίστοιχο με τα packages της Java) Προέκταση υπαρχουσών κλάσεων Unit Testing Βιβλιοθήκες / bindings για ανάπτυξη GUI

73 Υπάρχει ενδιαφέρον για επόμενο σεμινάριο???Υπάρχει ενδιαφέρον για επόμενο σεμινάριο???

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

Ιδέες και σκέψεις για δράσεις…74

Δημιουργία υποστηρικτικού υλικού (παρουσιάσεις, tutorials, how-to’s, κείμενα κ.λ.π.)

Δημιουργία site /ruby-hellug (Hellenic User Group) Διοργάνωση 2ου σεμιναρίου για την Ruby με τα

θέματα που αναφέρθηκαν πριν Διοργάνωση σεμιναρίου με θέμα το περιβάλλον

ανάπτυξης web εφαρμογών Ruby On Rails

Συμμετάσχετε και εσείς!Συμμετάσχετε και εσείς!

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

Υλικό και νέα σχετικά με την Ruby στο διαδίκτυο…

75

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 κ.λ.π.!

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

Βιβλιογραφία (1)76

“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

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

Βιβλιογραφία (2)77

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

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

Άδεια Χρήσης Ελεύθερης Τεκμηρίωσης GNU78

http://www.fsf.org/licensing/licenses/fdl.txt

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

Σας ευχαριστούμε για την παρουσία και την προσοχή σας. Μας τιμάτε. Ν. Δημητρακόπουλος, Γ. Μπουρλάκος