Επαναστατικές μεταβλητές σε Ruby

Οι μεταβλητές των στιγμιότυπων ξεκινούν με ένα σημάδι (@) και μπορούν να αναφερθούν μόνο μέσα στις μεθόδους της κλάσης. Διαφέρουν από τις τοπικές μεταβλητές στο ότι δεν υπάρχουν σε καμία συγκεκριμένη περίπτωση πεδίο εφαρμογής. Αντ 'αυτού, ένας παρόμοιος μεταβλητός πίνακας αποθηκεύεται για κάθε εμφάνιση μιας κλάσης. Οι μεταβλητές των παραμέτρων διασταυρώνονται μέσα σε μια κλάση instance, εφόσον η παράσταση παραμείνει ζωντανή, όπως και οι μεταβλητές στιγμιότυπων.

Οι μεταβλητές παραμέτρων μπορούν να αναφέρονται σε οποιαδήποτε μέθοδο αυτής της κλάσης. Όλες οι μέθοδοι μιας κλάσης χρησιμοποιούν την ίδια εμφάνιση μεταβλητό πίνακα, σε αντίθεση με τις τοπικές μεταβλητές όπου κάθε μέθοδος θα έχει διαφορετικό μεταβλητό πίνακα. Είναι δυνατή η πρόσβαση σε μεταβλητές instance χωρίς να τις ορίσετε πρώτα. Αυτό δεν θα προκαλέσει εξαίρεση, αλλά η τιμή της μεταβλητής θα είναι μηδέν και θα εκδοθεί μια προειδοποίηση εάν έχετε τρέξει Ruby με το -w διακόπτης.

Αυτό το παράδειγμα καταδεικνύει τη χρήση μεταβλητών στιγμιότυπων. Σημειώστε ότι το

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

Γιατί είναι το @δοκιμή μεταβλητή εσφαλμένη; Αυτό έχει να κάνει με το πεδίο εφαρμογής και τον τρόπο με τον οποίο ο Ruby υλοποιεί τα πράγματα. Μέσα σε μια μέθοδο, το εύρος μεταβλητής υποδείγματος αναφέρεται στη συγκεκριμένη περίπτωση αυτής της κλάσης. Ωστόσο, στο πεδίο της κλάσης (εντός της τάξης, αλλά εκτός από οποιεσδήποτε μεθόδους), το πεδίο εφαρμογής είναι το class instance πεδίο εφαρμογής. Ο Ruby εφαρμόζει την ιεραρχική τάξη με την παράδοση Τάξη αντικείμενα, έτσι υπάρχει ένα δεύτερη περίπτωση στο παιχνίδι εδώ. Ο πρώτος παράδειγμα είναι ένα παράδειγμα του Τάξη τάξη, και αυτό είναι όπου @δοκιμή θα πάω. Η δεύτερη περίπτωση είναι η παράσταση του TestClass, και αυτό είναι όπου @αξία θα πάω. Αυτό γίνεται λίγο συγκεχυμένο, αλλά θυμηθείτε να μην το χρησιμοποιήσετε ποτέ @instance_variables εκτός των μεθόδων. Εάν χρειάζεστε αποθήκευση σε όλη την τάξη, χρησιμοποιήστε το @@ μεταβλητές τάξης, το οποίο μπορεί να χρησιμοποιηθεί οπουδήποτε στο πεδίο της τάξης (μέσα ή έξω από τις μεθόδους) και θα συμπεριφέρεται το ίδιο.

Συνήθως δεν μπορείτε να αποκτήσετε πρόσβαση σε μεταβλητές στιγμιότυπων από το εξωτερικό ενός αντικειμένου. Για παράδειγμα, στο παραπάνω παράδειγμα, δεν μπορείτε απλά να καλέσετε t.value ή t. @ αξία για να αποκτήσετε πρόσβαση στη μεταβλητή της στιγμής @αξία. Αυτό θα παραβίαζε τους κανόνες του ενθυλάκωση. Αυτό ισχύει και για περιπτώσεις κλάσεων παιδιών, δεν μπορούν να έχουν πρόσβαση σε μεταβλητές instance που ανήκουν στην κλάση γονέων, παρόλο που είναι τεχνικά του ίδιου τύπου. Έτσι, για να παρέχεται πρόσβαση σε μεταβλητές στιγμιότυπων, όργανο εκτίμησης πρέπει να δηλώνονται οι μέθοδοι.

Το παρακάτω παράδειγμα δείχνει πώς μπορούν να γραφτούν οι μέθοδοι accessor. Ωστόσο, σημειώστε ότι Ρουμπίνι παρέχει μια συντόμευση και ότι αυτό το παράδειγμα υπάρχει μόνο για να σας δείξει πώς λειτουργούν οι μέθοδοι accessor. Γενικά δεν είναι συνηθισμένο να βλέπετε μεθόδους accessor γραμμένες με αυτόν τον τρόπο εκτός αν απαιτείται κάποιο πρόσθετο λογικό για το accessor.

Οι συντομεύσεις κάνουν τα πράγματα λίγο πιο εύκολα και πιο συμπαγή. Υπάρχουν τρεις από αυτές τις μεθόδους βοήθειας. Πρέπει να εκτελούνται στο πεδίο της κλάσης (εντός της κλάσης αλλά εκτός από οποιεσδήποτε μεθόδους) και θα καθορίζουν δυναμικά μεθόδους που μοιάζουν με τις μεθόδους που ορίζονται στο παραπάνω παράδειγμα. Δεν υπάρχει μαγεία που συμβαίνει εδώ, και μοιάζουν με λέξεις-κλειδιά γλώσσας, αλλά πραγματικά είναι απλώς δυναμικά ορίζοντας μεθόδους. Επίσης, αυτά τα εξαρτήματα συνήθως πηγαίνουν στην κορυφή της κατηγορίας. Αυτό δίνει στον αναγνώστη μια άμεση επισκόπηση των μεταβλητών μελών που θα είναι διαθέσιμες έξω από την τάξη ή τις τάξεις των παιδιών.

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

  • attr_reader - Καθορίστε μεθόδους "ανάγνωσης", όπως το όνομα στο παραπάνω παράδειγμα.
  • attr_writer - Καθορίστε μεθόδους "συγγραφέα" όπως το ηλικία = στο παραπάνω παράδειγμα.
  • attr_accessor - Ορίστε μεθόδους "ανάγνωσης" και "συγγραφέα".

Πότε πρέπει να χρησιμοποιείτε μεταβλητές εισόδου

Τώρα που ξέρετε ποιες είναι οι μεταβλητές των στιγμιότυπων, πότε τις χρησιμοποιείτε; Οι μεταβλητές παραμέτρων πρέπει να χρησιμοποιούνται όταν αντιπροσωπεύουν την κατάσταση του αντικειμένου. Το όνομα και η ηλικία του μαθητή, οι βαθμοί τους κλπ. Δεν πρέπει να χρησιμοποιούνται για προσωρινή αποθήκευση, γι 'αυτό είναι οι τοπικές μεταβλητές. Εντούτοις, θα μπορούσαν ενδεχομένως να χρησιμοποιηθούν για προσωρινή αποθήκευση μεταξύ μεθόδων που απαιτούν υπολογισμούς πολλαπλών σταδίων. Ωστόσο, εάν το κάνετε αυτό, ίσως θελήσετε να επανεξετάσετε τη σύνθεση της μεθόδου σας και να μετατρέψετε αυτές τις μεταβλητές σε παραμέτρους μεθόδου.

instagram story viewer