Κλάσεις και αντικειμενοστρέφεια

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 διασχίζει μέσω του @ISA

  • perlop - πλήρης πίνακας προτεραιότητας τελεστών· η isa βρίσκεται με τους μη προσεταιριστικούς σχεσιακούς τελεστές