Κλάσεις και αντικειμενοστρέφεια
untie#
Σπάει τη σύνδεση μεταξύ μιας μεταβλητής και της tied κλάσης της.
Η untie αντιστρέφει μια προηγούμενη tie: μετά την κλήση, η VARIABLE επανέρχεται σε απλό βαθμωτό, πίνακα, hash, ή filehandle, και οι επόμενες αναγνώσεις και εγγραφές αγγίζουν τον ωμό χώρο αποθήκευσης αντί να δρομολογούνται μέσω των FETCH, STORE, και συγγενών του tied πακέτου. Αν η μεταβλητή δεν είναι tied, η untie είναι no-op.
Σύνοψη#
untie VARIABLE
Τι επιστρέφεται#
Επιστρέφει αληθή τιμή αν η μεταβλητή ήταν tied και η σύνδεση αφαιρέθηκε, ψευδή διαφορετικά. Η τιμή επιστροφής σπάνια ελέγχεται - τα σημεία κλήσης γνωρίζουν αν ξετυλίγουν tie που έστησαν τα ίδια.
Ως παρενέργεια, αν το tied πακέτο ορίζει μέθοδο UNTIE, αυτή καλείται στο tied αντικείμενο πριν εγκαταλειφθεί η σύνδεση. Η UNTIE λαμβάνει το αντικείμενο και έναν μετρητή τυχόν εκκρεμών εσωτερικών αναφορών που κρατούνται σε αυτό (δείτε Οριακές περιπτώσεις παρακάτω).
Τι κάνει#
Εντοπίζει τη μαγεία στη
VARIABLEπου εγκατέστησε μια προηγούμενηtie.Αν το tied πακέτο παρέχει
UNTIE, την καλεί στο αντικείμενο.Αφαιρεί τη μαγεία ώστε η μεταβλητή να επανέλθει σε συνηθισμένο χώρο αποθήκευσης.
Απελευθερώνει την αναφορά του διερμηνέα στο tied αντικείμενο. Το αντικείμενο καταστρέφεται (πυροδοτώντας τη
DESTROYαν είναι ορισμένη) μόλις δεν παραμένουν άλλες αναφορές προς αυτό.
Μετά την untie, οποιαδήποτε τιμή είχε επιστρέψει προηγουμένως η tied για αυτή τη μεταβλητή δεν αντιστοιχεί πλέον σε ζωντανή σύνδεση.
Παραδείγματα#
Tie ενός hash, χρήση του, και μετά απελευθέρωσή του:
use Tie::File;
tie my @lines, 'Tie::File', 'log.txt' or die $!;
push @lines, "new entry";
untie @lines; # flush and release
Πλήρης κύκλος μέσω της tied - πιάστε το υποκείμενο αντικείμενο ώστε να μπορέσετε να καλέσετε μια μη-tied μέθοδο σε αυτό, και μετά εγκαταλείψτε τη σύνδεση:
my $obj = tied %cache;
$obj->flush;
untie %cache;
Η untie σε μεταβλητή που δεν έγινε ποτέ tied είναι αβλαβής:
my %h;
untie %h; # no-op, no warning
Hook UNTIE που εκτελείται πριν εξαφανιστεί η σύνδεση:
package My::Tied;
sub TIEHASH { bless {}, shift }
sub UNTIE { my ($self, $count) = @_;
warn "untie with $count outstanding refs" if $count }
# ...
tie my %h, 'My::Tied';
untie %h; # calls My::Tied::UNTIE($obj, 0)
Οριακές περιπτώσεις#
Εκκρεμείς εσωτερικές αναφορές: αν κώδικας έχει αποθηκεύσει το αντικείμενο που επέστρεψε η
tieή ηtiedκάπου που ακόμα το κρατά τη στιγμή που εκτελείται ηuntie, η Perl εκπέμπειuntie attempted while N inner references still exist
υπό
use warnings. Η σύνδεση αφαιρείται έτσι κι αλλιώς, αλλά αυτές οι αποθηκευμένες αναφορές συνεχίζουν να δείχνουν στο πλέον αποσπασμένο αντικείμενο. Εγκαταλείψτε αυτές τις αναφορές πρώτα, ή αποδεχθείτε ότι θα δουν τώρα το un-tied αντικείμενο μεμονωμένα.Η κλήση της
untieσε μη-tied μεταβλητή είναι no-op. Καμία προειδοποίηση, κανένα σφάλμα, καμία κλήση μεθόδου.Tie filehandle: η
untie *FHαφαιρεί την tie που εγκατέστησε ηtie *FH, $class, .... Το υποκείμενο glob και οποιοσδήποτε πραγματικός περιγραφέας αρχείου πίσω του δεν επηρεάζονται - ηuntieδεν κάνειclose.Η
UNTIEείναι προαιρετική: αν το tied πακέτο δεν ορίζει μία, η σύνδεση απλώς αφαιρείται. Μη βασίζεστε στο ότι ηUNTIEθα εκτελεστεί· πολλές tied κλάσεις την παραλείπουν.Σειρά καταστροφής: η
untieδεν καλεί η ίδια τηDESTROY. Το αντικείμενο καταστρέφεται όταν ο μετρητής αναφορών του φτάσει στο μηδέν, που μπορεί να είναι αμέσως μετά τηνuntie(αν τίποτα άλλο δεν το κρατά) ή αργότερα (αν ο καλών κράτησε αντίγραφο από τηνtied).Τοπικοποιημένες tied μεταβλητές: μια tie εγκατεστημένη μέσα σε εμβέλεια σε
localοποιημένη μεταβλητή αναιρείται αυτόματα όταν εξέρχεται η εμβέλεια· δεν χρειάζεστε ρητήuntie, και η κλήση μίας είναι αβλαβής.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
tie- εγκαθιστά τη σύνδεση που αφαιρεί ηuntie· δείχνει το πλήρες σύνολο ονομάτων μεθόδων tie-hooktied- ανακτά το αντικείμενο που είναι αυτή τη στιγμή συνδεδεμένο σε tied μεταβλητή, τυπικά ακριβώς πριν την κλήσηuntieσε αυτήνbless- ηtieκάνει bless το αντικείμενο που της δίνεται· ηuntieδεν κάνει unbless, μόνο αποσυνδέει τη μεταβλητή από αυτόref- εξετάστε τι είδος αναφοράς επέστρεψε ηtiedπριν αποφασίσετε να κάνετεuntielocal- εναλλακτική με όρια εμβέλειας όταν θέλετε η tie να εξαφανιστεί κατά την έξοδο μπλοκ χωρίς ρητήuntie