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

tied#

Επιστρέφει το αντικείμενο που στηρίζει μια δεμένη μεταβλητή.

Η tied σας παραδίδει την ίδια αναφορά που είχε αρχικά επιστρέψει η tie όταν η VARIABLE δεσμεύτηκε σε κλάση. Μέσω αυτής της αναφοράς μπορείτε να καλέσετε μεθόδους απευθείας στην υλοποίηση tie - παρακάμπτοντας τη συνήθη ανάθεση FETCH / STORE - και έτσι οι κλάσεις tie εκθέτουν επιπλέον λειτουργίες που δεν έχουν φυσική σύνταξη βαθμωτού / πίνακα / hash. Αν η VARIABLE δεν είναι δεμένη, η tied επιστρέφει undef.

Σύνοψη#

tied VARIABLE

Τι επιστρέφεται#

Μια αναφορά στο υποκείμενο αντικείμενο tie όταν η VARIABLE είναι δεμένη, και undef όταν δεν είναι. Η αναφορά είναι ακριβώς η τιμή που είχε αρχικά επιστρέψει η αντίστοιχη κλήση tie - ίδια κλάση, ίδια blessed ταυτότητα - οπότε η ref(tied $v) ονοματίζει την κλάση tie και οι κλήσεις μεθόδων πάνω της αναθέτονται κανονικά:

my $obj = tied %hash;
$obj->flush if defined $obj;

Χρησιμοποιήστε defined (ή λογικό έλεγχο, όταν η κλάση tie δεν κάνει ποτέ bless σε πακέτο με υπερφόρτωση ψευδούς) για να διακρίνετε μια δεμένη μεταβλητή από μια μη δεμένη πριν καλέσετε μεθόδους στο αποτέλεσμα.

Το τέχνασμα του «tie handle»#

Η tied είναι ο μοναδικός υποστηριζόμενος τρόπος για να μιλήσετε απευθείας στην υλοποίηση tie. Οποιαδήποτε μέθοδος της κλάσης tie που δεν είναι ένα από τα τυπικά hooks (FETCH, STORE, EXISTS, DELETE, CLEAR, FIRSTKEY, NEXTKEY και τα αντίστοιχα για πίνακα / βαθμωτό / handle) είναι προσπελάσιμη μόνο μέσω του αντικειμένου που επιστρέφει η tied:

tie my %cache, 'My::LRU', size => 1024;
tied(%cache)->stats;           # class-specific method, no hash syntax
tied(%cache)->evict_older_than(3600);

Αυτό είναι επίσης το μοτίβο για ενδοσκόπηση - να ρωτήσετε μια δεμένη μεταβλητή «σε ποιον είσαι δεμένη;» χωρίς να προϋποθέτετε γνώση του σημείου δέσμευσης:

my $class = ref tied @array;   # e.g. "Tie::File"

Παραδείγματα#

Βασικός έλεγχος δεσμότητας:

tie my %h, 'My::Tied::Hash';
print defined(tied %h) ? "tied\n" : "not tied\n";   # tied

Κλήση κλασικής-ειδικής μεθόδου μέσω του αντικειμένου tie:

tie my @log, 'Tie::File', 'app.log' or die $!;
tied(@log)->flock(2);          # LOCK_EX; Tie::File API
# ... mutate @log ...
tied(@log)->flock(8);          # LOCK_UN

Ένα απλό βαθμωτό, πίνακας, hash ή filehandle που ποτέ δεν δέθηκε:

my $x;
print defined(tied $x) ? "yes" : "no", "\n";        # no

Η tied δεν ξεδένει - η μεταβλητή παραμένει δεμένη μετά την κλήση, και διαδοχικές κλήσεις επιστρέφουν την ίδια αναφορά:

tie my $t, 'My::Counter';
my $a = tied $t;
my $b = tied $t;
print $a == $b ? "same\n" : "different\n";          # same

Πλήρης γύρος μέσω της ref για να μάθετε την κλάση tie:

tie my %db, 'DB_File', 'data.db', O_RDWR | O_CREAT, 0644;
print ref tied %db, "\n";      # DB_File

Οριακές περιπτώσεις#

  • Μη δεμένη: επιστρέφει undef. Καμία προειδοποίηση, καμία εξαίρεση. Αυτός είναι ο ιδιωματικός τρόπος για να ελέγξετε αν μια μεταβλητή είναι καθόλου δεμένη - δεν υπάρχει χωριστή ενσωματωμένη is_tied.

  • Filehandles: η tied *FH επιστρέφει το αντικείμενο για ένα δεμένο filehandle (δεσμευμένο με tie *FH, ...). Ένα glob που δεν δέθηκε ποτέ δίνει undef όπως κάθε άλλη μη δεμένη μεταβλητή.

  • Η tied δεν ξεδένει. Είναι καθαρός accessor. Για να απελευθερώσετε τη δέσμευση, καλέστε την untie. Το να κρατάτε την αναφορά που επιστρέφει η tied πέρα από το σημείο όπου η μεταβλητή ξεδένεται κρατά το αντικείμενο tie ζωντανό, πράγμα σκόπιμο - έτσι ενεργοποιούνται οι προειδοποιήσεις «untie attempted while N inner references still exist» της untie.

  • Δεμένο στοιχείο σύνθετου τύπου: όταν ένα μεμονωμένο στοιχείο πίνακα ή hash είναι το ίδιο δεμένο (χωριστά από τυχόν tie στον περιέκτη), η tied $array[0] ή tied $hash{key} επιστρέφει το ανά στοιχείο αντικείμενο, όχι του περιέκτη. Το tie περιέκτη και το tie στοιχείου είναι ανεξάρτητες δεσμεύσεις.

  • Οι αντιγραμμένες τιμές δεν είναι δεμένες. Η my $copy = $tied_scalar; συμβολοσειροποιεί μέσω FETCH· η $copy είναι απλό βαθμωτό και η tied $copy επιστρέφει undef. Το tie είναι ιδιότητα της μεταβλητής, όχι της τιμής.

  • Οι αναφορές σε δεμένες μεταβλητές διατηρούν το tie. Η \%hash όπου το %hash είναι δεμένο εξακολουθεί να παραπέμπει στον δεμένο περιέκτη, οπότε η tied %{ $ref } επιστρέφει το ίδιο αντικείμενο tie.

Διαφορές από το upstream#

Πλήρως συμβατό με το upstream Perl 5.42.

Δείτε επίσης#

  • tie - δεσμεύει μια μεταβλητή σε μια κλάση· εγκαθιδρύει τη σχέση tie που διερωτάται η tied

  • untie - απελευθερώνει το tie· μετά την κλήση της, η tied στην ίδια μεταβλητή επιστρέφει undef

  • ref - δίνει το όνομα κλάσης του αντικειμένου που επιστρέφει η tied χωρίς ξεχωριστή κλήση μεθόδου

  • bless - η tied επιστρέφει blessed αναφορά όταν η κλάση tie έκανε bless στο αντικείμενο που επέστρεψε από τον κατασκευαστή TIE*

  • defined - ο τυπικός έλεγχος «είναι δεμένη αυτή η μεταβλητή;» είναι defined tied $var