Ruby 3.0. Ruby και λιγότερο γνωστές μέθοδοι ελέγχου της ιδιωτικότητας
Tomasz Szkaradek
Αρχιτέκτονας ανάπτυξης
Ένα από τα πιο αγαπημένα χαρακτηριστικά της Ruby είναι το πολύ ευέλικτο συντακτικό της. Προσωπικά, αγαπώ τη Ruby για το πόσες δυνατότητες έχουμε στον ορισμό των κλάσεων και των ιδιοτήτων τους, και αυτό είναι που θα συζητήσω σε αυτό το άρθρο.
Βασικές λύσεις
Ας υποθέσουμε ότι χρησιμοποιούμε την κλάση Foo που έχει μία δημόσια μέθοδο και μία ιδιωτική μέθοδο:
κλάση Foo
def bar
:awesome
end
private
def baz
:something_private
end
end
Όλα είναι υπέροχα, βλέπουμε μια τέτοια λύση σχεδόν σε κάθε έργο. Εκτέλεση Foo.new.baz θα προκαλέσει το σφάλμα NoMethodError (κλήση της ιδιωτικής μεθόδου 'baz' για το # ) και αυτό ήταν που θέλαμε να κάνουμε. Τι θα συμβεί αν προσπαθήσουμε να αλλάξουμε τη μορφή αποθήκευσης και προσθέσουμε το private ως πρόθεμα στον ορισμό της κλάσης;
κλάση Foo
def bar
:awesome
end
private def baz
:something_private
end
end
Όπως μπορείτε να δείτε μετά την εκτέλεση του κωδικός, λειτουργεί πραγματικά! Γιατί μπορούμε να εισάγουμε την ορατότητα της μεθόδου πριν την εκτελέσουμε; Επειδή κατά τον ορισμό μιας μεθόδου, η def επιστρέφει το όνομα της μεθόδου ως σύμβολο. Αυτή η έκφραση δεν είναι μόνο ένα μέρος της σύνταξης, αλλά de facto μια μέθοδος που προέρχεται από την κλάση Module και αντιμετωπίζει αυτό το σύμβολο ως όρισμα. Για περισσότερες πληροφορίες, ανατρέξτε στην τεκμηρίωση σε αυτόν τον σύνδεσμο. Αφού ξεκίνησε τόσο εύκολα με την private, ας προσπαθήσουμε να αλλάξουμε την ορατότητα της private μεθόδου.
κλάση Foo
def bar
:awesome
end
private def baz
:something_private
end
public :baz
end
Επιτυχία! Η μέθοδος των βάσεων μας έγινε δημόσια επειδή την κάναμε ορατή δύο φορές. Φυσικά, η ίδια λειτουργία ισχύει και για τις ενότητες. Υπέροχα, αλλά πού μας οδηγεί αυτό; Αυτή η λειτουργικότητα μας δίνει πολλά γιατί μπορούμε να αλλάξουμε ελεύθερα την ορατότητα μιας μεθόδου κατά τον ορισμό της, ή ακόμα και να αλλάξουμε την ορατότητα των μεθόδων όταν τις κληρονομούμε.
Τώρα, ας ρίξουμε μια ματιά στο τι μπορεί να κάνει η Ruby 2.7 όσον αφορά την αλλαγή της ορατότητας των ψευδωνύμων και των accessors.
κλάση Foo
private attr_accessor :awesome_variable
end
Δυστυχώς, λαμβάνουμε ένα σφάλμα καθώς η ιδιωτική μέθοδος αναμένει σύμβολα και attr_accessor. Ο κώδικας επιστρέφει nil και έτσι αυτή η μέθοδος δεν είναι συμβατή με τη χρήση private στη Ruby 2.7. Ποιες είναι λοιπόν οι επιλογές μας;
Μπορούμε να χρησιμοποιήσουμε το attr_accessor κάτω από τη λέξη-κλειδί private για να το κάνουμε να λειτουργήσει, δηλαδή θα λάβουμε ένα σφάλμα όταν θέλουμε να αναφερθούμε στο φοβερή_μεταβλητήφοβερή_μεταβλητή μέθοδος.
κλάση Foo
private
attr_accessor :awesome_variable
end
Η δεύτερη επιλογή είναι η εκτέλεση της ιδιωτικής μεθόδου σε μεθόδους που παράγονται από attr_attribute; σε αυτή την περίπτωση, πρέπει επίσης να θυμηθούμε να εισάγουμε τον ρυθμιστή εκεί.
κλάση Foo
attr_accessor :awesome_variable
private :awesome_variable, :awesome_variable=
end
Προβλήματα με το attr_ * οι μέθοδοι δεν είναι τα μόνα εμπόδια. Μπορούμε να αντιμετωπίσουμε την ίδια δυσκολία όταν θέλουμε να δημιουργήσουμε ένα ιδιωτικό ψευδώνυμο.
κλάση Foo
private alias :bar, :awesome_bar
end
Το Ruby 3.0 και η επιχείρησή μας
Ευτυχώς, η Ruby 3.0 εισάγει μια μεγάλη αλλαγή, καθώς οι μέθοδοι ορατότητας μπορούν να λάβουν πίνακα ως όρισμα και το ψευδώνυμο των μεθόδων, attr_ *, μπορεί να επαναφέρει τον πίνακα με τα ονόματα των μεθόδων που έχουν οριστεί. Μπορείτε να διαβάσετε περισσότερα εδώ.
Τώρα, ας δούμε μερικά παραδείγματα στο τελευταίο euba και ας ελέγξουμε αν οι αλλαγές έχουν πράγματι γίνει και πώς μπορούμε να τις χρησιμοποιήσουμε. Στο πρώτο παράδειγμα, ας χρησιμοποιήσουμε το private πριν από τον προσπελάτη attr:
κλάση Foo
private attr_accessor :awesome_variable
end
Μια τέτοια κλήση δεν θα προκαλέσει σφάλματα κατά την ανάλυση της σύνταξης και, το σημαντικότερο, η awesome_variable καιawesome_variable =οι μέθοδοι γίνονται ιδιωτικές. Η μέθοδος alias θα κάνει το ίδιο, καθώς τώρα επιστρέφει επίσης ένα σύμβολο ως όνομα της νέας μεθόδου και το καθιστά ορατό.
κλάση Foo
private alias :bar, :awesome_bar
end
Ένα ενδιαφέρον γεγονός είναι ότι μπορούμε επίσης να εμβαθύνουμε σε περαιτέρω μεθόδους, π.χ. το φοβερόΗ ενότητα print μπορεί να κληθεί μεταξύ των private και attrαναγνώστη- είναι σημαντικό μια τέτοια μέθοδος να επιστρέφει έναν πίνακα με τα ονόματα των μεθόδων που βρίσκονται στη δεξιά πλευρά της έκφρασης.
κλάση Module
def awesome_print(names)
puts names
names
end
end
κλάση Foo
private awesome_print attr_reader :awesome_bar
end
Περίληψη
Ελπίζω να βρείτε αυτό το άρθρο χρήσιμο! Σε περίπτωση περισσότερων ειδήσεων σχετικά με το Ruby 3.0. διαβάστε περισσότερα εδώ.