Θα χρησιμοποιήσω την python ως παράδειγμα για το τι ψάχνω (μπορείτε να το θεωρήσετε ως ψευδοκώδικα αν δεν ξέρετε Python):
>>> a = 1
>>> type(a)
<type 'int'>
Ξέρω ότι στη ruby μπορώ να κάνω :
1.9.3p194 :002 > 1.class
=> Fixnum
Αλλά είναι αυτός ο σωστός τρόπος για να προσδιορίσω τον τύπο του αντικειμένου;
Ο σωστός τρόπος για να προσδιορίσετε τον "τύπο" ενός αντικειμένου, ο οποίος είναι ένας αμφιλεγόμενος όρος στον κόσμο της Ruby, είναι να καλέσετε το object.class
.
Δεδομένου ότι οι κλάσεις μπορούν να κληρονομούν από άλλες κλάσεις, αν θέλετε να προσδιορίσετε αν ένα αντικείμενο είναι "ενός συγκεκριμένου τύπου" μπορείτε να καλέσετε object.is_a?(ClassName)
για να δείτε αν το object
είναι τύπου ClassName
ή αν προέρχεται από αυτόν.
Κανονικά ο έλεγχος τύπου δεν γίνεται στη Ruby, αλλά αντίθετα τα αντικείμενα αξιολογούνται με βάση την ικανότητά τους να ανταποκρίνονται σε συγκεκριμένες μεθόδους, που συνήθως ονομάζονται "Duck typing". Με άλλα λόγια, αν ανταποκρίνεται στις μεθόδους που θέλετε, δεν υπάρχει'λόγος να είστε ιδιαίτερα προσεκτικοί σχετικά με τον τύπο.
Για παράδειγμα, το object.is_a;(String)
είναι πολύ άκαμπτο, αφού μια άλλη κλάση μπορεί να υλοποιήσει μεθόδους που το μετατρέπουν σε αλφαριθμητικό ή να το κάνουν να συμπεριφέρεται πανομοιότυπα με το πώς συμπεριφέρεται το String. Το object.respond_to?(:to_s)
θα ήταν ένας καλύτερος τρόπος για να ελέγξετε ότι το εν λόγω αντικείμενο κάνει αυτό που θέλετε.
θα μπορούσατε επίσης να δοκιμάσετε: instance_of?
p 1.instance_of? Fixnum #=> True
p "1".instance_of? String #=> True
p [1,2].instance_of? Array #=> True
Συχνά στη Ruby, δεν σας ενδιαφέρει ποια είναι η κλάση του αντικειμένου καθεαυτή, σας ενδιαφέρει μόνο ότι ανταποκρίνεται σε μια συγκεκριμένη μέθοδο. Αυτό είναι γνωστό ως Duck Typing και θα το δείτε σε όλα τα είδη των κωδικών της Ruby.
Έτσι, σε πολλές (αν όχι στις περισσότερες) περιπτώσεις, το καλύτερο είναι να χρησιμοποιείτε το Duck Typing χρησιμοποιώντας το #respond_to?(method)
:
object.respond_to?(:to_i)