Μετάβαση στο περιεχόμενο

Ruby

Από τη Βικιπαίδεια, την ελεύθερη εγκυκλοπαίδεια
Ruby
Γενικά
Ημερ. Δημιουργίας1995
Είδοςσυναρτησιακή γλώσσα προγραμματισμού,διερμηνευμένη γλώσσα,ελεύθερο λογισμικό,γλώσσα προγραμματισμού
Διανομή
Έκδοση3.3.4 (9 Ιουλίου 2024)[1]
ΛειτουργικάMicrosoft Windows,Linux,BSD,macOS
Ανάπτυξη
Γραμμένο σεC
Άδεια χρήσηςGPLv2
Σύνδεσμοι
Επίσημος ιστότοπος
https://www.ruby-lang.org/
Αποθετήριο κώδικα
https://git.ruby-lang.org/ruby.git

ΗRubyείναι μιαδυναμική,ανακλαστική,αντικειμενοστρεφήςγλώσσα προγραμματισμούγενικής χρήσης, που συνδυάζει μιασύνταξηεπηρεασμένη από τηνPerlμε χαρακτηριστικά από τηSmalltalk.Η Ruby προήλθε από τηνΙαπωνίαστα μέσα της δεκαετίας του 1990 και αρχικά σχεδιάστηκε και αναπτύχθηκε από τονΓιουκιχίρο Ματσουμότο.Βασικές της επιρροές είναι ηPerlSmalltalkEiffelκαι ηLisp.

Η Ruby υποστηρίζει πολλαπλά παραδείγματα προγραμματισμού όπως οσυναρτησιακός προγραμματισμός,οαντικειμενοστρεφής προγραμματισμός,οπροστακτικός προγραμματισμόςκαι οανακλαστικός (reflective) προγραμματισμός.Έχει σύστημαδυναμικών τύπωνκαι αυτόματη διαχείριση μνήμης, επομένως μοιάζει σε κάποια χαρακτηριστικά της με τηνPython,τηνPerl,τηLisp,τηDylan,τηνPikeκαι τηCLU.

Η πρότυπη υλοποίηση 1.8.7 της Ruby είναι γραμμένη σεC,σαν μιαδιερμηνευόμενηγλώσσα ενός περάσματος. Προς το παρόν δεν υπάρχει κάποιο επίσημο πρότυπο αναφοράς για τη γλώσσα Ruby, επομένως η αρχική υλοποίηση θεωρείται τοντε φάκτοσημείο αναφοράς. Υπάρχουν αρκετές (ολοκληρωμένες ή σε ανάπτυξη) εναλλακτικές υλοποιήσεις της γλώσσας, συμπεριλαμβανομένων τωνYARV,JRuby,Rubinius,IronRuby,MacRubyκαιHotRuby,κάθε μια από τις οποίες και έχει διαφορετική προσέγγιση, με τις IronRuby, JRuby και MacRuby να προσφέρουνjust-in-time compilationκαι τη MacRuby να προσφέρει επιπλέονahead-of-time compilation.Ο κώδικας της επίσημης έκδοσης 1.9 χρησιμοποιεί τηYARV,όπως και αυτός της έκδοσης 2.0 (σε ανάπτυξη), η οποία και θα αντικαταστήσει την πιο αργήRuby MRI.

Γιουκιχίρο Ματσουμότο, ο δημιουργός της Ruby.

Η αρχική ιδέα για τη Ruby προέκυψε στις 24 Φεβρουαρίου 1993 από τον Γιουκιχίρο Ματσουμότο που είχε σκοπό να δημιουργήσει μια νέα γλώσσα που θα ισορροπούσε μεταξύ συναρτησιακού και προστακτικού προγραμματισμού.[2]Ο Ματσουμότο έχει δηλώσει: "Ήθελα μιαγλώσσα σεναρίωνπιο ισχυρή από τηνPerlκαι πιο αντικειμενοστρεφή από τηνPython.Για αυτό αποφάσισα να σχεδιάσω τη δική μου γλώσσα ".[3]

Ετυμολογία του ονόματος "Ruby"

[Επεξεργασία|επεξεργασία κώδικα]

Το όνομα "Ruby" αποφασίστηκε στη διάρκεια μιας ηλεκτρονικής συνομιλίας μεταξύ του Ματσουμότο και του Κέιτζου Ισιτσούκα στις 24 Φεβρουαρίου του 1993, πριν γραφεί κώδικας για τη γλώσσα.[4]Αρχικά προτάθηκαν δύο ονόματα: "Coral" και "Ruby", με το τελευταίο να είναι η επιλογή του Ματσουμότο σε ένα μήνυμα ηλεκτρονικής αλληλογραφίας στη συνέχεια στον Ισιτσούκα.[5]Ο Matsumoto αργότερα είχε δηλώσει ότι ένας παράγοντας υπέρ της επιλογής του ονόματος "Ruby" ήταν το ότι βρισκόταν στην "πέτρα γενεθλίων" (birthstone) ενός από τους συναδέλφους του.[6]

Αρχική δημοσιοποίηση

[Επεξεργασία|επεξεργασία κώδικα]

Η πρώτη δημόσια έκδοση της Ruby 0.95 ανακοινώθηκε σε εγχώριεςομάδες νέων (newsgroups)της Ιαπωνίας την 21η Δεκεμβρίου 1995.[7][8]Στη συνέχεια τρεις εκδόσεις της Ruby έγιναν διαθέσιμες στο διάστημα δύο ημερών[4],ταυτόχρονα με τη δημιουργία της λίστας ηλεκτρονικού ταχυδρομείου ruby-list (στην Ιαπωνική γλώσσα), η οποία ήταν η πρώτη λίστα για τη νέα γλώσσα.

Ήδη σε αυτή τη φάση της ανάπτυξης ήταν παρόντα αρκετά από τα χαρακτηριστικά που έγιναν γνώριμα από τις επόμενες εκδόσεις της Ruby, όπως η αντικειμενοστρεφής σχεδίαση, οι κλάσεις με κληρονομικότητα, ταmixin,οι απαριθμητές (iterators), τακλεισίματα (closures),ο χειρισμός εξαιρέσεων (exception handling), και ησυλλογή απορριμμάτων.[9]

Η Ruby έφτασε την έκδοση 1.0 στις 25 Δεκεμβρίου 1996.[4]

Μετά την έκδοση Ruby 1.3 το 1999, άρχισε η πρώτη λίστα ταχυδρομείου στην αγγλική γλώσσα, η ruby-talk,[3]που υπήρξε η αρχή ενός αυξανόμενου ενδιαφέροντος για τη γλώσσα εκτός Ιαπωνίας. Το Σεπτέμβριο του 2000, τυπώθηκε το πρώτο βιβλίο στην αγγλική, το "Programming Ruby", το οποίο και αργότερα δημοσιεύθηκε ελεύθερα για το κοινό, ωθώντας και άλλο τη χρήση της Ruby στον αγγλόφωνο κόσμο.

Δείτε επίσης:Ruby on Rails

Το 2005, το ενδιαφέρον για τη γλώσσα Ruby εκτοξεύθηκε σε συνδυασμό με τοRuby on Rails,ένα πλαίσιο ανάπτυξηςWebεφαρμογών (web application framework) γραμμένο σε Ruby. Το Rails συχνά θεωρείται ότι έκανε "διάσημη" τη Ruby και συνδέεται τόσο στενά με αυτήν που συχνά οι νέοι προγραμματιστές σε Ruby θεωρούν τη γλώσσα και το πλαίσιο ταυτόσημα.[10]

Η Ruby 1.9.1 εισάγει κάποιες σημαντικές αλλαγές σε σχέση με την έκδοση 1.8.6. Κάποια παραδείγματα ακολουθούν:

  • Τοπικές μεταβλητές (μεταβλητές που είναι ορατές μόνο στην ενότητα/block στην οποία δηλώθηκαν)
  • Επιπλέον σύνταξη για λ-εκφράσεις (fun = ->(a,b) { puts a + b })
  • Υποστηρίζονται κωδικοποιήσεις χαρακτήρων ανά συμβολοσειρά

Ο Ματσουμότο έχει πει ότι η Ruby έχει σχεδιαστεί για παραγωγικότητα και ευχάριστη χρήση από τον προγραμματιστή, ακολουθώντας τις αρχές της καλής σχεδίασης διεπαφών χρήστη.[11]Τονίζει ότι η σχεδίαση συστημάτων πρέπει να δίνει έμφαση στις ανθρώπινες ανάγκες, και όχι σε αυτές του υπολογιστή:[12]

Συχνά οι άνθρωποι, ειδικά οι μηχανικοί υπολογιστών, εστιάζουν στους υπολογιστές. Σκέφτονται: "Κάνοντας αυτό, ο υπολογιστής θα τρέξει πιο γρήγορα. Κάνοντας αυτό, ο υπολογιστής θα τρέξει πιο αποδοτικά. Κάνοντας αυτό, ο υπολογιστής θα..." Εστιάζουν την προσοχή τους στους υπολογιστές. Αλλά στην πραγματικότητα πρέπει να εστιάσουμε στους ανθρώπους, στο πώς οι άνθρωποι προγραμματίζουν ή χειρίζονται τις εφαρμογές των υπολογιστών. Είμαστε τα αφεντικά. Οχι οι σκλάβοι.

Η Ruby λέγεται ότι ακολουθεί την "αρχή της ελάχιστης έκπληξης", το οποίο σημαίνει ότι η γλώσσα πρέπει να συμπεριφέρεται έτσι ώστε να μην μπερδεύονται οι έμπειροι χρήστες της. Ο Ματσουμότο έχει πει ότι ο βασικός στόχος της σχεδίασής του ήταν να δημιουργήσει μια γλώσσα, την οποία θα απολάμβανε ο ίδιος να χρησιμοποιεί, ελαχιστοποιώντας την προγραμματιστική δουλειά και τα πιθανά διφορούμενα σημεία. Έχει πει ότι δεν είχε εφαρμόσει την αρχή της ελάχιστης έκπληξης στη Ruby,[12]αλλά η φράση έχει πια συνδεθεί στενά με αυτήν. Η φράση η ίδια έχει υπάρξει πηγή εκπλήξεων, αφού οι αρχάριοι χρήστες πιστεύουν ότι σημαίνει ότι οι συμπεριφορές της Ruby προσπαθούν να μοιάσουν σε αυτές άλλων γνώριμων γλωσσών. Σε μια συζήτηση το Μάιο του 2005 στην ομάδα comp.lang.ruby, ο Ματσουμότο προσπάθησε να κρατήσει μια απόσταση μεταξύ της Ruby και της παραπάνω "αρχής", εξηγώντας ότι, αφού κάθε σχεδιαστική απόφαση θα καταπλήξει κάποιον, χρησιμοποιεί ένα προσωπικό μέτρο για την αποτίμηση της "έκπληξης". Αν αυτό το προσωπικό μέτρο παραμένει συνεπές, θα υπάρχουν λίγες εκπλήξεις για αυτούς που το γνωρίζουν.[13]

Ο Matsumoto το περιέγραψε ως εξής σε μια συνέντευξη:[12]

Κάθε άνθρωπος έχει ένα προσωπικό παρελθόν. Κάποιος μπορεί να ήρθε από τηνPython,κάποιος άλλος από τηνPerl,και μπορεί να εκπλαγούν από διάφορες όψεις της γλώσσας. Τότε έρχονται και μου λένε, 'ένιωσα έκπληξη από αυτό το χαρακτηριστικό της γλώσσας, η Ruby παραβαίνει την αρχή της ελάχιστης έκπληξης.' Περίμενε. Περίμενε. Η αρχή της ελάχιστης έκπληξης δεν είναι μόνο για εσένα. Η αρχή της ελάχιστης έκπληξης σημαίνει την αρχή της ελάχιστηςδικής μουέκπληξης. Και αυτό σημαίνει ότι ισχύει όταν έχεις μάθει τη Ruby αρκετά καλά. Για παράδειγμα, ήμουν προγραμματιστής τηςC++πριν αρχίσω τη σχεδίαση της Ruby. Προγραμμάτιζα αποκλειστικά σε C++ για δύο με τρία χρόνια. Και μετά από δύο χρόνια προγραμματισμού με C++, η γλώσσα αυτή εξακολουθεί να με εκπλήσσει.

  • Πλήρως αντικειμενοστρεφής με κληρονομικότητα,mixin,και μετακλάσεις[14]
  • Δυναμικοί τύποικαιDuck typing
  • Τα πάντα είναι εκφράσεις (ακόμα και οι εντολές) και τα πάντα εκτελούνταιπροστακτικά(ακόμα και οιδηλώσεις)
  • Σύντομη και ευέλικτησύνταξη[15]που ελαχιστοποιεί το "συντακτικό θόρυβο" και είναι η βάση για γλώσσες συγκεκριμένων πεδίων (domain specific languages)[16]
  • Δυναμική ανάκλαση και τροποποίηση αντικειμένων στο χρόνο εκτέλεσης για τη διευκόλυνση τουμεταπρογραμματισμού
  • Κλεισίματα, απαριθμητές καιγεννήτριες,με μια μοναδική σύνταξη ενοτήτων (blocks)[17]
  • Ρητός συμβολισμός για δυναμικούς πίνακες, πίνακες κατακερματισμού (hashes),κανονικές εκφράσειςκαισύμβολα
  • Ενσωμάτωση κώδικα σε συμβολοσειρές (variable interpolation)
  • Παράμετροι με εξορισμού τιμές (Default arguments)
  • Τέσσερα επίπεδα εμβέλειας μεταβλητών: καθολική, κλάσης, στιγμιότυπου κλάσης και τοπική, που σημειώνονται με σύμβολα (sigils) και χρήση κεφαλαίων-μικρών ανά περίπτωση
  • Αυτόματη συλλογή απορριμμάτων
  • Συνέχειες (continuations)πρώτης τάξης
  • Αυστηροί κανόνες έμμεσης μετατροπής τιμών αληθείας (τα πάντα είναι αληθή εκτός τουfalseκαι τουnil)
  • Χειρισμός εξαιρέσεων
  • Υπερφόρτωση τελεστών
  • Ενσωματωμένη υποστήριξη γιαρητούς αριθμούς,μιγαδικούς αριθμούςκαι αριθμητική άπειρης ακρίβειας
  • Ρυθμιζόμενη διανομή των κλήσεων μεθόδων (dispatch) (με τιςmethod_missingκαιconst_missing)
  • Εγγενήνήματακαι συνεργατικές ίνες (cooperative fibers)
  • Αρχική υποστήριξη για το πρότυποUnicodeκαι πολλαπλές κωδικοποιήσεις χαρακτήρων (αν και με κάποια προβλήματα μέχρι την έκδοση 1.9)[18]
  • plug-inAPI σεC
  • Τοκέλυφος Ruby
  • Κεντρική διαχείριση πακέτων μέσω τωνRubyGems
  • Έχει υλοποιηθεί σε όλες τις σημαντικές πλατφόρμες
  • Μεγάλη βασική βιβλιοθήκη

Η Ruby είναιαντικειμενοστρεφής:κάθε τύπος δεδομένων είναι αντικείμενο, συμπεριλαμβανομένων και των κλάσεων και των τύπων που άλλες γλώσσες θεωρούν βασικούς (όπως οι ακέραιοι, οι τιμές αλήθειας και η τιμή "nil" ). Κάθε συνάρτηση είναι μια μέθοδος. Οι τιμές με όνομα (μεταβλητές) πάντα είναι αναφορές σε αντικείμενα, και όχι τα ίδια τα αντικείμενα. Η Ruby υποστηρίζει κληρονομικότητα με δυναμική διανομή μεθόδων (dynamic dispatch),mixinκαι μεθόδους singleton (που ανήκουν και ορίζονται μόνο σε ένα αντικείμενο και όχι σε ολόκληρη την κλάση). Αν και η Ruby δεν υποστηρίζει πολλαπλή κληρονομικότητα, οι κλάσεις μπορούν να εισάγουν μονάδες κώδικα (modules) σαν mixin. Η διαδικαστική σύνταξη υποστηρίζεται αλλά όλες οι μέθοδοι που ορίζονται εκτός της εμβέλειας ενός συγκεκριμένου αντικειμένου είναι στην πραγματικότητα μέθοδοι της κλάσης Object. Επειδή η κλάση αυτή είναι η βασική κλάση κάθε άλλης βάσης, οι αλλαγές είναι ορατές σε όλες τις κλάσεις και τα αντικείμενα.

Η Ruby έχει περιγραφεί σαν γλώσσα προγραμματισμού πολλών παραδειγμάτων: επιτρέπει διαδικαστικό προγραμματισμό (ο ορισμός συναρτήσεων/μεταβλητών εκτός κλάσεων τις κάνει μέρος της κλάσης ρίζας, 'self' Object), με αντικειμενοστρεφή χαρακτηριστικά (τα πάντα είναι αντικείμενα) ήσυναρτησιακάχαρακτηριστικά και συνέχειες - όλες οι εντολές έχουν τιμές, και οι συναρτήσεις επιστρέφουν την τελευταία τιμή τους). Επιτρέπει ενδοσκόπηση (introspection), ανάκλαση (reflection) και μεταπρογραμματισμό, και υποστηρίζει[19]νήματα βασισμένα στο διερμηνέα. Η Ruby έχει δυναμικόσύστημα τύπωνκαι υποστηρίζειπαραμετρικό πολυμορφισμό.

Σύμφωνα με τη λίστα συχνών ερωτήσεων της Ruby,[20]:

"Αν σας αρέσει ηPerl,θα σας αρέσει η Ruby και θα νιώσετε άνετα με τη σύνταξή της. Αν σας αρέσει ηSmalltalk,θα σας αρέσει η Ruby και θα νιώσετε άνετα με τη σημασιολογία της. Αν σας αρέσει ηPython,μπορεί (ή μπορεί και όχι) να σας ξενίσει η τεράστια διαφορά στη φιλοσοφία σχεδίασης μεταξύ της Python και των Ruby/Perl. "

Η σύνταξη της Ruby είναι παρόμοια με αυτή τηςPerlκαι τηςPython.Οι ορισμοί κλάσεων και μεθόδων ξεχωρίζουν από λέξεις-κλειδιά. Σε αντίθεση με την Perl, δεν είναι απαραίτητο οι μεταβλητές να έχουν στην αρχή τους ένααναγνωριστικό σύμβολο.Όταν αυτό όμως χρησιμοποιείται αλλάζει η σημασία της εμβέλειας της μεταβλητής. Η εμφανέστερη διαφορά σε σχέση με τη C και τηνPerlείναι ότι συνήθως χρησιμοποιούνται λέξεις-κλειδιά για τον ορισμό λογικών ενοτήτων κώδικα, χωρίς αγκύλες (δηλ., ζευγάρι { και }). Για πρακτικούς λόγους, δεν υπάρχει διαχωρισμός μεταξύ εκφράσεων και εντολών[21].Οι αλλαγές γραμμής είναι σημαντικές και αποτελούν το τέλος μιας εντολής - επίσης μπορεί να χρησιμοποιηθεί ένα ελληνικό ερωτηματικό στη θέση τους. Σε αντιδιαστολή με την Python, οι εσοχές (indentation) δεν έχουν σημασία.

Μια από τις διαφορές της Ruby σε σχέση με τηνPythonκαι τηνPerlείναι ότι η Ruby κρατά όλες τις μεταβλητές ενός αντικειμένου σαν ιδιωτικές (private) μέσα σε μια κλάση και τις εκθέτει προς τα έξω μόνο μέσω μεθόδων πρόσβασης (attr_writer, attr_reader, κλπ.). Σε αντίθεση με τις μεθόδους "getter" και "setter" άλλων γλωσσών όπως η C++ ή ηJava,οι μέθοδοι πρόσβασης στη Ruby δημιουργούνται με μια γραμμή κώδικα με χρήση μεταπρογραμματισμού. Επειδή η κλήση αυτών των μεθόδων δε χρειάζεται παρενθέσεις, είναι εύκολο να αλλάξουμε μια μεταβλητή ενός αντικειμένου σε μια πλήρη συνάρτηση, χωρίς να αλλάξουμε ούτε μια γραμμή κώδικα ή refactoring, επιτυγχάνοντας παρόμοια λειτουργικότητα με τα μέλη ιδιοτήτων τηςC#και τηςVB.NET.Οι περιγραφείς ιδιοτήτων της Python (property descriptors) είναι παρόμοιοι αλλά έχουν ένα κόστος στη φάση της ανάπτυξης του λογισμικού. Αν κάποιος αρχίσει στην Python με μια δημόσια μεταβλητή ενός αντικειμένου και στη συνέχεια αλλάξει την υλοποίησή της σε μια ιδιωτική μεταβλητή που φαίνεται μέσα από έναν περιγραφέα ιδιοτήτων, ο εσωτερικός κώδικας της κλάσης μπορεί να χρειαστεί να διορθωθεί ώστε να χρησιμοποιεί την ιδιωτική μεταβλητή και όχι τη δημόσια. Η Ruby αφαιρεί αυτήν την επιλογή της σχεδίασης, επιβάλλοντας όλες οι μεταβλητές αντικειμένων να είναι ιδιωτικές, αλλά παρέχει έναν απλό τρόπο να ορίζονται μέθοδοι get και set. Αυτό συμφωνεί με την ιδέα ότι στη Ruby, κανείς δεν έχει άμεση πρόσβαση στα εσωτερικά μέλη μιας κλάσης από το εξωτερικό της αλλά μπορεί μόνο να στείλει ένα μήνυμα στην κλάση και να λάβει μια απάντηση.

Δείτε ταπαραδείγματαγια δείγματα κώδικα που δείχνουν τη σύνταξη της Ruby.

Διαφορές στη συμπεριφορά σε σχέση με άλλες γλώσσες

[Επεξεργασία|επεξεργασία κώδικα]

Κάποια χαρακτηριστικά που διαφέρουν σημαντικά σε σχέση με γλώσσες όπως η C ή η Perl:

  • Η σύνταξη της γλώσσας διακρίνει μεταξύ κεφαλαίων και μικρών στα αναγνωριστικά (identifiers), θεωρώντας ότι οι μεταβλητές με κεφαλαία είναι σταθερές.
  • Τα σύμβολα$και@δεν δείχνουν τον τύπο της μεταβλητής όπως στην Perl, αλλά την εμβέλειά της.
  • Για να δείξετε έναν αριθμό κινητής υποδιαστολής χωρίς δεκαδικό μέρος, πρέπει να τελειώνει σε 0 (99.0) ή να μετατρέπεται ρητά (99.to_f). Δεν αρκεί να προστεθεί η τελεία (99.) γιατί οι αριθμοί ακολουθούν τη σύνταξη των μεθόδων.
  • Η αποτίμηση τιμών αληθείας δεδομένων που δεν είναι αυτού του τύπου είναι αυστηρή: το0,το""και το[]αποτιμώνται σεtrue.Στη C, η έκφραση0? 1: 0αποτιμάται σε 0 (δηλ. false). Στη Ruby, όμως, επιστρέφει 1, γιατί όλοι οι αριθμοί αποτιμώνται σε true; μόνο τοnilκαι τοfalseαποτιμώνται σεfalse.Ένα αποτέλεσμα αυτού του κανόνα είναι ότι οι μέθοδοι της Ruby κατά σύμβαση — για παράδειγμα, οι αναζητήσεις κανονικών εκφράσεων — όταν επιτύχουν επιστρέφουν αριθμούς, συμβολοσειρές, λίστες ή άλλες τιμές που δεν είναι false αλλά επιστρέφουνnilόταν αποτύχουν. Αυτή η σύμβαση χρησιμοποιείται επίσης και στη Smalltalk, όπου μόνο τα ειδικά αντικείμεναtrueκαιfalseμπορούν να χρησιμοποιηθούν σε μια έκφραση αλήθειας.
  • Οι εκδόσεις πριν την 1.9 χρησιμοποιούν απλούς ακέραιους για να αναπαραστήσουν τους χαρακτήρες, όπως στη C. Αυτό μπορεί να προκαλέσει εκπλήξεις όταν τεμαχίζονται οι συμβολοσειρές: το"abc" [0]επιστρέφει 97 (τον κώδικαASCIIτου πρώτου χαρακτήρα της συμβολοσειράς) - για να πάρουμε"a"πρέπει να χρησιμοποιηθεί η"abc" [0,1](υποσυμβολοσειρά μήκους 1) ή η"abc" [0].chr.
  • Η έκφρασηstatement until expression,σε αντίθεση με τις αντίστοιχες εντολές άλλων γλωσσών (π.χ.do { statement } while (!(expression));στη C/C++/...), στην πραγματικότητα δεν τρέχει ποτέ την εντολή statement αν η έκφραση expression είναι ήδη αληθής. Αυτό συμβαίνει γιατί ηstatement until expressionείναι στην πραγματικότητα μια πιο φιλική μορφή (syntactic sugar) τηςuntil expression; statement; end,η αντίστοιχη της οποίας στη C/C++ είναι ηwhile (!(expression)) { statement; },όπως ηstatement if expressionείναι ισοδύναμη με τηνif (expression) { statement; }.Όμως, η σύνταξηbegin statement end until expressionστη Ruby θα εκτελέσει την εντολή statement μια φορά ακόμα και αν η έκφραση expression είναι ήδη αληθής, μια συμπεριφορά που μοιάζει με αυτή του "do-while" άλλων γλωσσών.
  • Επειδή οι σταθερές είναι αναφορές σε αντικείμενα, η αλλαγή αυτού στο οποίο δείχνει μια μεταβλητή δημιουργεί μια προειδοποίηση αλλά η τροποποίηση του ίδιου του αντικειμένου όχι. Για παράδειγμα, ο κώδικαςGreeting << "world!" if Greeting == "Hello"δεν εμφανίζει κάποιο μήνυμα λάθους η προειδοποίησης. Αυτό είναι παρόμοιο με τις μεταβλητές final της Java ή με τους δείκτες const σε μη-const αντικείμενα στη C++, αλλά η Ruby επιτρέπει το "πάγωμα" ενός αντικειμένου, σε αντίθεση με τηJava.

Κάποια χαρακτηριστικά που διαφέρουν σε σχέση με άλλες γλώσσες:

  • Οι συνηθισμένοι τελεστές για εκφράσεις συνθήκης,andκαιor,δεν ακολουθούν τους κανονικούς κανόνες προτεραιότητας: οandδεν έχει προτεραιότητα έναντι τουor.Η Ruby επίσης έχει τελεστές εκφράσεων||και&&που δουλεύουν με τον κλασικό τρόπο.
Δείτε επίσηςInteractive Ruby Shell

Η επίσημη διανομή της Ruby περιλαμβάνει το "irb",έναν αλληλεπιδραστικό διερμηνέα γραμμής εντολών που μπορεί να χρησιμοποιηθεί για γρήγορες δοκιμές κώδικα. Το παρακάτω κομμάτι κώδικα αναπαριστά ένα παράδειγμα χρήσης τουirb:

$irb
irb(main):001:0>puts"Hello, World"
Hello,World
=>nil
irb(main):002:0>1+2
=>3

Τα παρακάτω παραδείγματα μπορούν να εκτελεστούν από ένα κέλυφος της Ruby όπως τοInteractive Ruby Shellή να αποθηκευτούν σε ένα αρχείο και να εκτελεστούν από τη γραμμή εντολών γράφονταςruby <filename>.

Το κλασικό παράδειγμαHello world:

puts"Hello World!"

Βασικός κώδικας σε Ruby:

# Τα πάντα, συμπεριλαμβανομένων των τιμών, είναι αντικείμενα, επομένως αυτό δουλεύει:
-199.abs# 199
"ruby is cool".length# 12
"Your mother is nice.".index("u")# 2
"Nice Day Isn't It?".downcase.split("").uniq.sort.join# "'?acdeinsty"

Μετατροπές:

puts"What's your favorite number?"
number=gets.chomp
output_number=number.to_i+1
putsoutput_number.to_s+' is a bigger and better favorite number.'

Υπάρχουν διάφοροι τρόποι να δηλωθούν συμβολοσειρές στη Ruby.

Τα παρακάτω παραδείγματα είναι ισοδύναμα και υποστηρίζουν τηνπαρεμβολή συμβολοσειρών (interpolation):

a="\nThis is a double-quoted string\n"
a=%Q{\nThis is a double-quoted string\n}
a=%{\nThis is a double-quoted string\n}
a=%/\nThis is a double-quoted string\n/
a=<<-BLOCK

This is a double-quoted string
BLOCK

Οι παρακάτω αναθέσεις είναι ισοδύναμες και παράγουν βασικές συμβολοσειρές:

a='This is a single-quoted string'
a=%q{This is a single-quoted string}

Δημιουργία και χρήση ενός πίνακα:

a=[1,'hi',3.14,1,2,[4,5]]

putsa[2]# 3.14
putsa.[](2)# 3.14
putsa.reverse# [[4, 5], 2, 1, 3.14, 'hi', 1]
putsa.flatten.uniq# [1, 'hi', 3.14, 2, 4, 5]

Δημιουργία και χρήση ενός πίνακα συσχετίσεων (πίνακες κατακερματισμού ή hashes στη Ruby):

hash={:water=>'wet',:fire=>'hot'}
putshash[:fire]# Τυπώνει: hot

hash.each_pairdo|key,value|# Ή: hash.each do |key, value|
puts"#{key}is#{value}"
end

# Τυπώνει: water is wet
# fire is hot

hash.delete:water# Σβήνει το:water => 'wet'
hash.delete_if{|key,value|value=='hot'}# Σβήνει το:fire => 'hot'

Ενότητες και απαριθμητές

[Επεξεργασία|επεξεργασία κώδικα]

Σύνταξη με δύο τρόπους για τη δημιουργία ενοτήτων κώδικα:

{puts"Hello, World!"}# Παρατηρήστε τις { αγκύλες }

doputs"Hello, World!"end

Όταν δημιουργείται μια ενότητα κώδικα, πάντα είναι συνδεδεμένη με μια μέθοδο, ως προαιρετική παράμετρο της ενότητας.

Πέρασμα σαν παράμετρο μιας ενότητας για να είναι κλείσιμο:

# Σε μια μεταβλητή αντικειμένου (σημειώνεται με '@') καταγράφεται η ενότητα.
defremember(&a_block)
@block=a_block
end

# Κλήση της παραπάνω μεθόδου, της δίνεται μια ενότητα που παίρνει ένα όνομα.
remember{|name|puts"Hello,#{name}!"}

# Όταν πρέπει (για το αντικείμενο) -- κάλεσε το κλείσιμο!
@block.call("Jon")
# => "Hello, Jon!"

Δημιουργία μιας ανώνυμης συνάρτησης:

proc{|arg|printarg}
Proc.new{|arg|printarg}
lambda{|arg|printarg}

Επιστροφή ενόςκλεισίματοςαπό μια μέθοδο:

defcreate_set_and_get(initial_value=0)# Εξ'ορισμού τιμή 0
closure_value=initial_value
returnProc.new{|x|closure_value=x},Proc.new{closure_value}
end

setter,getter=create_set_and_get# δηλ. επιστρέφει δυο τιμές
setter.call(21)
getter.call# => 21

#Μπορείτε επίσης να χρησιμοποιήσετε μια μεταβλητή παράμετρο σαν δέσμευση για το κλείσιμο.
#Το παραπάνω μπορεί να γραφεί σαν...

defcreate_set_and_get(closure_value=0)
proc{|x|closure_value=x},proc{closure_value}
end

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

defuse_hello
yield"hello"
end

# Κλήση της παραπάνω μεθόδου, δίνοντάς της μια ενότητα.
use_hello{|string|putsstring}# => 'hello'

Απαρίθμηση ακολουθιών και πινάκων με τη χρήση ενοτήτων:

array=[1,'hi',3.14]
array.each{|item|putsitem}
# => 1
# => 'hi'
# => 3.14

array.each_index{|index|puts"#{index}:#{array[index]}"}
# => 0: 1
# => 1: 'hi'
# => 2: 3.14

(3..6).each{|num|putsnum}
# => 3
# => 4
# => 5
# => 6

Μια μέθοδος όπως η inject() μπορεί να δέχεται και μια παράμετρο και μια ενότητα. Η inject εκτελείται σε κάθε μέλος μιας λίστας, εκτελώντας κάποια συνάρτηση σε αυτό, κρατώντας ένα σύνολο. Αυτό είναι ανάλογο με τη συνάρτησηfoldlστις συναρτησιακές γλώσσες προγραμματισμού. Για παράδειγμα:

[1,3,5].inject(10){|sum,element|sum+element}# => 19

Στο πρώτο πέρασμα, η ενότητα δέχεται το 10 (την παράμετρο) σαν sum, και το 1 (το πρώτο στοιχείο του πίνακα) σαν στοιχείο και επιστρέφει 11. Το 11 τότε γίνεται το sum του επόμενου περάσματος, που προστίθεται στο 3 για να γίνει 14. Το 14 στη συνέχεια προστίθεται στο 5, για να επιστρέψει τελικά 19.

Οι ενότητες δουλεύουν με πολλές ενσωματωμένες μεθόδους:

File.open('file.txt','w')do|file|# 'w' σημαίνει "γράψιμο".
file.puts'Wrote some text.'
end# Το αρχείο κλείνει αυτόματα εδώ

File.readlines('file.txt').eachdo|line|
putsline
end
# => Wrote some text.

Χρησιμοποιώντας μια απαρίθμηση και μια ενότητα για να πάρουμε το τετράγωνο των αριθμών από το 1 ως το 10:

(1..10).collect{|x|x*x}# => [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

Ο παρακάτω κώδικας ορίζει μια κλάση με το όνομα Person. Εκτός του 'initialize', του κλασικού κατασκευαστή (constructor) που δημιουργεί νέα αντικείμενα, έχει δύο μεθόδους: μία που αντικαθιστά τον τελεστή σύγκρισης <=> (ώστε τοArray#sortνα ταξινομεί κατά ηλικία) και μία που αντικαθιστά τη μέθοδοto_s(ώστε ηKernel#putsνα μπορεί να μορφοποιήσει την έξοδό της). Εδώ ο κώδικας "attr_reader"είναι ένα παράδειγμα μεταπρογραμματισμού σε Ruby: η"attr_accessor"ορίζει μεθόδους" getter "και" setter "των μεθόδων των αντικειμένων, ενώ η"attr_reader"μόνο μεθόδους" getter ". Επίσης, η τελευταία αποτιμημένη εντολή μιας μεθόδου είναι και η τιμή που επιστρέφει, επιτρέποντας την παράλειψη της 'return'.

classPerson
attr_reader:name,:age
definitialize(name,age)
@name,@age=name,age
end
def<=>(person)# Τελεστής σύγκρισης για ταξινόμηση
@age<=>person.age
end
defto_s
"#@name(#@age) "
end
end

group=[
Person.new("Bob",33),
Person.new("Chris",16),
Person.new("Ash",23)
]

putsgroup.sort.reverse

Τα παραπάνω τυπώνουν τρία ονόματα σε αντίστροφη σειρά ηλικίας:

Bob (33)
Ash (23)
Chris (16)

Στη Ruby οι κλάσεις δεν είναι ποτέ κλειστές: μπορείτε πάντα να προσθέσετε μεθόδους σε μια υπάρχουσα κλάση. Αυτό εφαρμόζεται τόσο στις κλάσεις που γράφετε, όσο και στις ενσωματωμένες κλάσεις. Το μόνο που έχετε να κάνετε είναι να ανοίξετε τον ορισμό μιας υπάρχουσας κλάσης, και τα νέα περιεχόμενα που θα ορίσετε θα προστεθούν εκεί. Ένα απλό παράδειγμα πρόσθεσης μια νέας μεθόδου στην κλάση Time της βασικής βιβλιοθήκης:

# ξανα-ανοίγει την κλάση Time της Ruby
classTime
defyesterday
self-86400
end
end

today=Time.now# => Thu Aug 14 16:51:50 +1200 2008
yesterday=today.yesterday# => Wed Aug 13 16:51:50 +1200 2008

Η προσθήκη μεθόδων σε κλάσεις που έχουν ήδη οριστεί συχνά ονομάζεται "μπάλωμα-μαϊμού" (monkey-patching). Η πρακτική αυτή, μπορεί να οδηγήσει σε πιθανές συγκρούσεις όσον αφορά τη συμπεριφορά του κώδικα και στη συνέχεια σε απρόβλεπτα αποτελέσματα. Αν ακολουθείται χωρίς προσοχή μπορεί να οδηγήσει σε πρόβλημα διαχείρισης του μεγέθους του κώδικα.

Μια εξαίρεση εμφαίζεται με την κλήση τηςraise:

raise

Σε μια εξαίρεση μπορεί να προστεθεί ένα προαιρετικό μήνυμα:

raise"This is a message"

Μπορεί επίσης να δοθεί ο τύπος της εξαίρεσης:

raiseArgumentError,"Illegal arguments!"

Εναλλακτικά μπορείτε να περάσετε ένα στιγμιότυπο μιας εξαίρεσης στη μέθοδο raise:

raiseArgumentError.new("Illegal arguments!")

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

classParseError<Exception
definitializeinput,line,pos
super"Could not parse '#{input}' at line#{line},position#{pos}"
end
end

raiseParseError.new("Foo",3,9)

Οι εξαιρέσεις χειρίζονται από την πρότασηrescue.Μια τέτοια πρόταση μπορεί να πιάσει τις εξαιρέσεις που κληρονομούν από την StandardError. Επίσης οιelseκαιensureυποστηρίζουν τη χρήση με εξαιρέσεις.

begin
# Κάνε κάτι
rescue
# Χειρισμός της εξαίρεσης
else
# Αλλιώς κάνε αυτό αν δεν εμφανίστηκε εξαίρεση
ensure
# Κάνε αυτό σε κάθε περίπτωση (είτε εμφανίστηκε εξαίρεση ή όχι)
end

Ένα κοινό λάθος είναι να προσπαθείτε να πιάσετε όλες τις εξαιρέσεις με μια μόνο πρόταση rescue. Αυτό γίνεται σωστά ως εξής:

begin
# Κάνε κάτι
rescueException# όχι απλά rescue -- αυτό πιάνει μόνο την StandardError, υποκλάση της Exception
# Χειρισμός της εξαίρεσης
end

Ο χειρισμός συγκεκριμένων εξαιρέσεων γίνεται ως εξής:

begin
#...
rescueRuntimeError
# χειρισμός
end

Επίσης το αντικείμενο της εξαίρεσης μπορεί να γίνει διαθέσιμο στο σώμα κώδικα του χειριστή της εξαίρεσης:

begin
#...
rescueRuntimeError=>e
# χειριστής που μπορεί να χρησιμοποιεί το e, όπως η "print e.to_s"
end

Εναλλακτικά η πιο πρόσφατη εξαίρεση αποθηκεύεται στη "μαγική" καθολική μεταβλητή$!.

Μπορείτε επίσης να πιάσετε πολλές εξαιρέσεις:

begin
#...
rescueRuntimeError,Timeout::Error=>e
# χειριστής που μπορεί να χρησιμοποιεί το e
end

Μεταπρογραμματισμός

[Επεξεργασία|επεξεργασία κώδικα]

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

Για παράδειγμα, ο κώδικας σε Ruby που ακολουθεί δημιουργεί νέες μεθόδους για την ενσωματωμένη κλάση String (συμβολοσειρές), με βάση μια λίστα από χρώματα. Οι μέθοδοι περικλείουν τα περιεχόμενα μιας συμβολοσειράς με κώδικαHTMLμε το κατάλληλο χρώμα.

COLORS={:black=>"000",
:red=>"f00",
:green=>"0f0",
:yellow=>"ff0",
:blue=>"00f",
:magenta=>"f0f",
:cyan=>"0ff",
:white=>"fff"}

classString
COLORS.eachdo|color,code|
define_method"in_#{color}"do
"<span style=\ "color: ##{code}\ ">#{self}</span> "
end
end
end

Οι μέθοδοι που προκύπτουν τότε μπορούν να χρησιμοποιηθούν ως εξής:

"Hello, World!".in_blue

=> "<span style=\" color: #00f\ ">Hello, World!</span>"

Για να υλοποιηθεί κάτι αντίστοιχο σε άλλες γλώσσες, ο προγραμματιστής θα έπρεπε να γράψει κάθε μέθοδο (in_black, in_red, in_green, κλπ.) με το χέρι.

Κάποιες άλλες πιθανές χρήσεις του μεταπρογραμματισμού σε Ruby περιλαμβάνουν:

  • υποκλοπή και τροποποίηση κλήσεων συναρτήσεων
  • υλοποίηση νέων μοντέλων κληρονομικότητας
  • δυναμική παραγωγή κλάσεων από παραμέτρους
  • αυτόματη σειριακοποίηση (serialization) αντικειμένων
  • διαδραστική βοήθεια καιαποσφαλμάτωση

Η έκδοση 1.9 της Ruby, αποτελείται από μια μοναδική υλοποίηση γραμμένη σε C που χρησιμοποιεί μια εικονική μηχανή ειδική για Ruby.

Η έκδοση 1.8 της Ruby έχει δυο βασικές υλοποιήσεις: τον επίσημο διερμηνέα της Ruby, ο οποίος συχνά αποκαλείται και "Ο διερμηνέας του Matz για τη Ruby" ή MRI, και είναι αυτός που χρησιμοποιείται πιο συχνά, και τηJRuby,μια υλοποίηση βασισμένη σεJavaπου εκτελείται στην εικονική μηχανή της Java.

Υπάρχουν και άλλες λιγότερο γνωστές ή νεότερες υλοποιήσεις όπως η Cardinal (υλοποιημένη στηνεικονική μηχανή Parrot), ηIronRuby,[22]ηMacRuby,η MagLev, ηRubiniusRuby.NETXRubyκαι ηHotRuby(εκτελεί κώδικα Ruby σεφυλλομετρητές ιστούκαι στην πλατφόρμα Flash).

Το πόσο ώριμη είναι μια υλοποίηση της Ruby συνήθως μετράται από το αν είναι ικανή να εκτελεί το πλαίσιοRuby on Rails(Rails), γιατί είναι πολύπλοκο στην υλοποίηση και χρησιμοποιεί πολλά χαρακτηριστικά που είναι μόνο διαθέσιμα στη Ruby. Το σημείο στο οποίο μια υλοποίηση μπορεί να το πετύχει αυτό, ονομάζεταιη μοναδικότητα των Rails(The Rails singularity). Μέχρι το Μάιο του 2010, μόνο ηβασική υλοποίηση (MRI)και ηJRubyμπορούν να εκτελέσουν το Rails χωρίς τροποποιήσεις σε ένα περιβάλλον παραγωγής. ΗRubiniusκυκλοφόρησε την έκδοση 1.0 που μπορεί να εκετελεί το Rails,[23]αλλά δεν είναι σίγουρο ότι μπορεί να χρησιμοποιηθεί σε περιβάλλοντα παραγωγής ακόμα.[24]ΗIronRuby[25][26]μπορεί να τρέξει κάποιες δοκιμαστικές περιπτώσεις του Rails, αλλά ακόμα δεν είναι έτοιμη για περιβάλλοντα παραγωγής.

Η Ruby είναι διαθέσιμη σε πολλάλειτουργικά συστήματαόπως τοLinux,τοMac OS X,ταMicrosoft Windows,ταWindows CEκαι οι πιο πολλές εκδόσεις τουUnix.

Η Ruby 1.9 πρόσφατα μεταφέρθηκε στοSymbianOS 9.x.[27]

Αποθήκες κώδικα και βιβλιοθήκες

[Επεξεργασία|επεξεργασία κώδικα]

Το Ruby Application Archive (RAA) και το RubyForge, λειτουργούν σαν αποθήκες κώδικα (repositories) για πολλές εφαρμογές και βιβλιοθήκες της Ruby, περιλαμβάνοντας πάνω από 7000 αντικείμενα. Αν και ο αριθμός των εφαρμογών που είναι διαθέσιμος δεν είναι ίδιος με αυτόν των κοινοτήτων τηςPerlή τηςPython,υπάρχουν πολλά εργαλεία που ενθαρρύνουν την περαιτέρω ανάπτυξη κώδικα στη γλώσσα.

ΟRubyGemsέχει γίνει ο βασικός διαχειριστής πακέτων για βιβλιοθήκες σε Ruby. Ο σκοπός του μοιάζει με το CPAN της Perl αλλά η χρήση του μοιάζει πιο πολύ με τοapt-get.

Πρόσφατα πολλές παλιές και νέες βιβλιοθήκες στεγάζονται στο GitHub, το οποίο εστιάζει στοGitκαι είχε βασική υποστήριξη για πακετάρισμα RubyGems.[28]

  1. «Ruby 3.3.4 Released».9 Ιουλίου 2024.Ανακτήθηκε στις 9 Ιουλίου 2024.
  2. http://www.ruby-lang.org/en/about/Αρχειοθετήθηκε2010-04-19 στοWayback Machine.Ruby-Lang About Ruby(Αγγλικά)
  3. 3,03,1http://www.linuxdevcenter.com/pub/a/linux/2001/11/29/ruby.htmlAn Interview with the Creator of Ruby(Αγγλικά)
  4. 4,04,14,2http://blog.nicksieger.com/articles/2006/10/20/rubyconf-history-of-rubyΙστρία της Ruby(Αγγλικά)
  5. http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/88819Αρχειοθετήθηκε2011-07-17 στοWayback Machine."[FYI: historic] The decisive moment of the language name Ruby. (Re: [ANN] ruby 1.8.1)" - Email από τον Hiroshi Sugihara στη ruby-talk(Αγγλικά)
  6. http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/394Αρχειοθετήθηκε2018-12-25 στοWayback Machine."Re: the name of Ruby?" - Email από τον Yukihiro Matsumoto στη ruby-talk
  7. http://eigenclass.org/hiki/ruby+0.95Αρχειοθετήθηκε2015-11-06 στοWayback Machine.More archeolinguistics: unearthing proto-Ruby(Αγγλικά)
  8. http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/382Αρχειοθετήθηκε2011-07-16 στοWayback Machine."Re: history of ruby" - Email from Yukihiro Matsumoto to ruby-talk(Αγγλικά)
  9. http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/124Αρχειοθετήθηκε2003-05-24 στοWayback Machine."TUTORIAL - ruby's features" - Email από το Yukihiro Matsumoto στη ruby-list
  10. «Αρχειοθετημένο αντίγραφο».Αρχειοθετήθηκεαπό το πρωτότυποστις 3 Μαρτίου 2016.Ανακτήθηκε στις 13 Ιουλίου 2010.
  11. The Ruby Programming Language by Yukihiro Matsumoto on 2000-06-12 (informit.com)
  12. 12,012,112,2The Philosophy of Ruby, A Conversation with Yukihiro Matsumoto, Part I by Bill Venners on 2003-09-29 (Artima Developer)(Αγγλικά)
  13. Ruby Weekly News 23rd - 29th May 2005
  14. An Interview with the Creator of Ruby(Αγγλικά)
  15. Dynamic Productivity with Ruby(Αγγλικά)
  16. martinfowler.com(Αγγλικά)
  17. Blocks and Closuresin Ruby(Αγγλικά)
  18. «Unicode support in Ruby is too buggy compared to similar programming languages(Αγγλικά)».Αρχειοθετήθηκεαπό το πρωτότυποστις 21 Ιουλίου 2011.Ανακτήθηκε στις 13 Ιουλίου 2010.
  19. πράσινα νήματα
  20. Ruby FAQ(Αγγλικά)
  21. In Ruby's syntax, statement is just a special case of an expression which cannot appear as an argument (e.g. multiple assignment).http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/1120Αρχειοθετήθηκε2011-07-17 στοWayback Machine.
    statement [...] can not be part of expression unless grouped within parentheses.http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/2460Αρχειοθετήθηκε2004-07-22 στοWayback Machine.
  22. Lam, John (24 Ιουλίου 2008).«IronRuby at OSCON».Αρχειοθετήθηκεαπό το πρωτότυποστις 7 Αυγούστου 2008.Ανακτήθηκε στις 4 Αυγούστου 2008.We're shipping our first binary release. In this package, we're taking a "batteries included" approach and shipping the Ruby standard libraries in it
  23. Peter Cooper (18 Μαΐου 2010).«The Why, What, and How of Rubinius 1.0's Release».
  24. Charles Nutter (27 Απριλίου 2008).«Promise and Peril for Alternative Ruby Impls».Ανακτήθηκε στις 1 Ιουνίου 2008.
  25. John Lam (25 Μαΐου 2008).«IronRuby / Rails Question».Αρχειοθετήθηκεαπό το πρωτότυποστις 17 Μαρτίου 2009.Ανακτήθηκε στις 25 Μαΐου 2008.
  26. John Lam (30 Μαΐου 2008).«IronRuby and Rails».Αρχειοθετήθηκεαπό το πρωτότυποστις 1 Ιουνίου 2008.Ανακτήθηκε στις 1 Ιουνίου 2008.
  27. «Ruby 1.9 for Symbian OS».Ανακτήθηκε στις 3 Δεκεμβρίου 2008.[νεκρός σύνδεσμος]
  28. Gem Building is Defunct,GitHub Blog

Εξωτερικοί σύνδεσμοι

[Επεξεργασία|επεξεργασία κώδικα]