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

untie#

Σπάει τη σύνδεση μεταξύ μιας μεταβλητής και της tied κλάσης της.

Η untie αντιστρέφει μια προηγούμενη tie: μετά την κλήση, η VARIABLE επανέρχεται σε απλό βαθμωτό, πίνακα, hash, ή filehandle, και οι επόμενες αναγνώσεις και εγγραφές αγγίζουν τον ωμό χώρο αποθήκευσης αντί να δρομολογούνται μέσω των FETCH, STORE, και συγγενών του tied πακέτου. Αν η μεταβλητή δεν είναι tied, η untie είναι no-op.

Σύνοψη#

untie VARIABLE

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

Επιστρέφει αληθή τιμή αν η μεταβλητή ήταν tied και η σύνδεση αφαιρέθηκε, ψευδή διαφορετικά. Η τιμή επιστροφής σπάνια ελέγχεται - τα σημεία κλήσης γνωρίζουν αν ξετυλίγουν tie που έστησαν τα ίδια.

Ως παρενέργεια, αν το tied πακέτο ορίζει μέθοδο UNTIE, αυτή καλείται στο tied αντικείμενο πριν εγκαταλειφθεί η σύνδεση. Η UNTIE λαμβάνει το αντικείμενο και έναν μετρητή τυχόν εκκρεμών εσωτερικών αναφορών που κρατούνται σε αυτό (δείτε Οριακές περιπτώσεις παρακάτω).

Τι κάνει#

  1. Εντοπίζει τη μαγεία στη VARIABLE που εγκατέστησε μια προηγούμενη tie.

  2. Αν το tied πακέτο παρέχει UNTIE, την καλεί στο αντικείμενο.

  3. Αφαιρεί τη μαγεία ώστε η μεταβλητή να επανέλθει σε συνηθισμένο χώρο αποθήκευσης.

  4. Απελευθερώνει την αναφορά του διερμηνέα στο 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-hook

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

  • bless - η tie κάνει bless το αντικείμενο που της δίνεται· η untie δεν κάνει unbless, μόνο αποσυνδέει τη μεταβλητή από αυτό

  • ref - εξετάστε τι είδος αναφοράς επέστρεψε η tied πριν αποφασίσετε να κάνετε untie

  • local - εναλλακτική με όρια εμβέλειας όταν θέλετε η tie να εξαφανιστεί κατά την έξοδο μπλοκ χωρίς ρητή untie