Κλάσεις και αντικειμενοστρέφεια
isa#
Ελέγχει αν ένα αντικείμενο είναι στιγμιότυπο μιας κλάσης ή οποιασδήποτε υποκλάσης που παράγεται από αυτήν.
Η isa είναι δυαδικός τελεστής, όχι συνάρτηση. Ο αριστερός τελεστέος είναι μια έκφραση που θα πρέπει να αποδώσει αναφορά αντικειμένου· ο δεξιός τελεστέος κατονομάζει μια κλάση. Επιστρέφει αληθές όταν ο αριστερός τελεστέος είναι blessed αναφορά της οποίας η κλάση είναι - ή κληρονομεί από - την κλάση στα δεξιά. Επιστρέφει ψευδές για οτιδήποτε άλλο, περιλαμβανομένων των undef, μη-blessed αναφορών και απλών συμβολοσειρών. Δεν εκτοξεύει ποτέ.
Σε αντίθεση με την παλιά μέθοδο UNIVERSAL::isa, η isa είναι ασφαλής να εφαρμοστεί σε αυθαίρετες τιμές: η κλήση $x->isa("Foo") σε απλή συμβολοσειρά που τυχαίνει να κατονομάζει μια κλάση ($x = "Foo") επικαλείται τη μέθοδο κλάσης και επιστρέφει αληθές, που σχεδόν ποτέ δεν είναι αυτό που εννοούσε ο καλών. Η isa ως τελεστής αναφέρει αληθές μόνο για blessed στιγμιότυπα.
Σύνοψη#
use feature 'isa'; # or: use v5.36;
$obj isa Some::Class
$obj isa "Different::Class"
$obj isa $name_of_class
Τι επιστρέφεται#
1 για blessed αντικείμενο του οποίου η κλάση είναι, ή παράγεται από, την CLASS. Την ορισμένη κενή συμβολοσειρά "" (ψευδής τιμή που αριθμητικά είναι μηδέν και εξαιρείται από τις προειδοποιήσεις uninitialized) σε κάθε άλλη περίπτωση.
Ο τελεστής δεν εγείρει ποτέ εξαίρεση: τιμές αόριστες, μη αναφερόμενες και λανθασμένα ταυτοποιημένες απλώς δοκιμάζονται ως ψευδείς.
Πύλη χαρακτηριστικού#
Η isa είναι διαθέσιμη από την Perl 5.31.6 και έπαψε να είναι πειραματική από την Perl 5.36. Είναι λεξιλογικό χαρακτηριστικό, που ενεργοποιείται με ένα από τα εξής:
use feature 'isa';
use v5.36; # enables the 5.36 feature bundle
Υπό no feature 'isa' (ή σε εμβέλεια που δεν την ενεργοποίησε ποτέ), το bareword isa επανέρχεται στο να είναι κανονικό αναγνωριστικό, και η έκφραση αποτελεί συντακτικό σφάλμα.
Η δεξιά πλευρά#
Ο δεξιός τελεστέος της isa επιλύεται σε όνομα κλάσης κατά τη μεταγλώττιση όταν είναι bareword:
$obj isa Some::Class # bareword - resolved at compile time
Κάθε άλλη έκφραση αποτιμάται κατά τον χρόνο εκτέλεσης και πρέπει να αποδώσει συμβολοσειρά που κατονομάζει την κλάση:
$obj isa "Different::Class" # string literal
$obj isa $class_name # scalar variable
$obj isa (ref $other) # any expression yielding a string
Τα barewords στη δεξιά πλευρά δεν χρειάζεται να δηλωθούν, να εισαχθούν ή να φορτωθούν· η isa συμβουλεύεται μόνο τον πίνακα συμβόλων της CLASS για να διασχίσει το @ISA. Μια κλάση που δεν φορτώθηκε ποτέ απλώς δεν έχει γονείς, οπότε το $obj isa Unknown::Class απλώς δοκιμάζεται ως ψευδές.
Παραδείγματα#
Βασικός έλεγχος στιγμιότυπου:
use feature 'isa';
package Animal { }
package Dog { our @ISA = ('Animal'); }
my $rex = bless {}, 'Dog';
$rex isa Dog; # true
$rex isa Animal; # true - via @ISA
$rex isa Cat; # false
Φραγή κλήσης μεθόδου επί της πραγματικής κλάσης:
sub describe {
my ($thing) = @_;
return "unknown" unless $thing isa Animal;
return $thing->sound;
}
Ασφαλής σε αυθαίρετες τιμές - καμία εξαίρεση σε μη αναφορές:
undef isa Animal; # false
"Animal" isa Animal; # false - a string is not an instance
[] isa Animal; # false - unblessed ref
{} isa Animal; # false - unblessed ref
\&main::x isa Animal; # false - unblessed code ref
Αποστολή σε όνομα κλάσης που συλλήφθηκε κατά τον χρόνο εκτέλεσης:
for my $class (qw(Dog Cat Fish)) {
if ($rex isa $class) {
say "rex is a $class";
}
}
Γιατί η isa προτιμάται έναντι της UNIVERSAL::isa ως μέθοδος:
my $x = "Dog";
$x->isa('Dog'); # TRUE - string "Dog" is treated as a class name
$x isa Dog; # false - $x is not a blessed instance
Η πρώτη μορφή κάνει σιωπηλά το λάθος πράγμα σε οποιαδήποτε συμβολοσειρά τυχαίνει να ταιριάζει με όνομα φορτωμένης κλάσης. Η μορφή τελεστή έχει επίγνωση τύπου και αναφέρει αυτό που πραγματικά ήθελε να μάθει ο καλών.
Οριακές περιπτώσεις#
Ο αριστερός τελεστέος είναι
undef: ο τελεστής επιστρέφει ψευδές. Δεν εκπέμπεται προειδοποίησηuninitialized- αυτό είναι σκόπιμα σιωπηλός έλεγχος.Ο αριστερός τελεστέος είναι μη-blessed αναφορά: ψευδές. Η
isaαπαιτεί blessed αναφορά· αναφορές πινάκων, αναφορές κατακερματισμού και code refs που δεν έχουν περάσει ποτέ μέσω τηςblessαποτυγχάνουν τον έλεγχο.Ο αριστερός τελεστέος είναι απλή συμβολοσειρά: ψευδές, ακόμη και όταν η συμβολοσειρά ταιριάζει με όνομα φορτωμένης κλάσης. Αυτή είναι η συμπεριφορική απόκλιση από την
UNIVERSAL::isaπου καλείται ως μέθοδος.Ο δεξιός τελεστέος κατονομάζει άγνωστη κλάση: ο τελεστής δεν κάνει auto-load ούτε require του αρθρώματος. Διασχίζει το
@ISAτης κλάσης· μια άγνωστη κλάση δεν έχει@ISA, οπότε ο έλεγχος είναι ψευδής.Πολλαπλή κληρονομικότητα: η
isaτιμά όποια σειρά επίλυσης μεθόδου είναι ενεργή στην κλάση (mro,c3ή η προεπιλεγμένη αναζήτηση κατά βάθος). Η αναζήτηση είναι η ίδια διάσχιση που χρησιμοποιεί η αποστολή μεθόδου.Reblessed αντικείμενα: ο έλεγχος αντικατοπτρίζει το τρέχον bless. Η εκ νέου κλήση της
blessσε μια αναφορά αλλάζει αυτό που αναφέρει ηisa.Προτεραιότητα αναλυτή: η
isaείναι μη προσεταιριστικός ονομασμένος τελεστής με την ίδια προτεραιότητα με τους σχεσιακούς τελεστές (lt,gt,le,ge). Η αλυσίδωση ($a isa B isa C) είναι συντακτικό σφάλμα, όπως και με τους άλλους σχεσιακούς.Χαρακτηριστικό μη ενεργοποιημένο: χωρίς
use feature 'isa'(ήuse v5.36), ο αναλυτής βλέπει τηνisaως συνηθισμένο bareword και η έκφραση αποτυγχάνει να μεταγλωττιστεί.Ο δεξιός τελεστέος ως κλήση υπορουτίνας: γράψτε τον με παρενθέσεις. Το
$obj isa some_class()αναλύεται· το$obj isa some_classμεταχειρίζεται τοsome_classως κυριολεκτικό όνομα κλάσης (bareword).
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
bless- επισυνάψτε όνομα κλάσης σε μια αναφορά ώστε ηisa(και η αποστολή μεθόδου) να έχει κάτι να αναφέρειref- ανακτήστε το όνομα κλάσης μιας blessed αναφοράς, ή τον υποκείμενο τύπο για μη-blessed· συμπληρώνει τηνisaόταν χρειάζεστε το όνομα αντί για απάντηση ναι/όχιclass- η εγγενής συντακτική σύνταξη δήλωσης κλάσης (χαρακτηριστικόclass, Perl 5.38+)· τα αντικείμενα που κατασκευάζονται με τηνclassείναι συνηθισμένες blessed αναφορές και λειτουργούν με τηνisaαμετάβληταUNIVERSAL::isa- η ιστορική μορφή μεθόδου. Λειτουργεί σε κάθε αναφορά, αλλά επιστρέφει επίσης αληθές για απλές συμβολοσειρές που τυχαίνει να κατονομάζουν μια κλάση· σε νέο κώδικα χρησιμοποιήστε τον τελεστήmro- ελέγχει τη σειρά επίλυσης μεθόδου που ηisaδιασχίζει μέσω του@ISAperlop- πλήρης πίνακας προτεραιότητας τελεστών· ηisaβρίσκεται με τους μη προσεταιριστικούς σχεσιακούς τελεστές