Κλάσεις και αντικειμενοστρέφεια
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 που διερωτάται ηtieduntie- απελευθερώνει το tie· μετά την κλήση της, ηtiedστην ίδια μεταβλητή επιστρέφειundefref- δίνει το όνομα κλάσης του αντικειμένου που επιστρέφει ηtiedχωρίς ξεχωριστή κλήση μεθόδουbless- ηtiedεπιστρέφει blessed αναφορά όταν η κλάση tie έκανε bless στο αντικείμενο που επέστρεψε από τον κατασκευαστήTIE*defined- ο τυπικός έλεγχος «είναι δεμένη αυτή η μεταβλητή;» είναιdefined tied $var