Δέσιμο μεταβλητών με tie#

Μια μεταβλητή με tie μοιάζει με συνηθισμένο βαθμωτό, πίνακα, hash ή filehandle, αλλά κάθε ανάγνωση, εγγραφή και επανάληψη πάνω της δρομολογείται εκ νέου μέσα από μεθόδους που γράφετε εσείς. Η μεταβλητή είναι το δημόσιο πρόσωπο· μια κλάση δικού σας σχεδιασμού είναι ο μηχανισμός από πίσω. Η ανάθεση σε ένα βαθμωτό με tie καλεί το δικό σας STORE· η ανάγνωση ενός κλειδιού hash με tie καλεί το δικό σας FETCH· η εκτέλεση του keys πάνω σε ένα hash με tie οδηγεί τα δικά σας FIRSTKEY και NEXTKEY. Ο καλών γράφει απλή Perl και δεν βλέπει ποτέ την κλάση.

Αυτή η έμμεση δρομολόγηση είναι που κάνει το tie ισχυρό. Ένα hash μπορεί να είναι μια πρόσοψη πάνω από μια βάση δεδομένων στον δίσκο. Ένα βαθμωτό μπορεί να επαναϋπολογίζει τον εαυτό του σε κάθε ανάγνωση. Ένα filehandle μπορεί να συγκεντρώνει σε μια συμβολοσειρά οτιδήποτε εκτυπώνεται σε αυτό. Ο κώδικας που χρησιμοποιεί τη μεταβλητή δεν αλλάζει· αλλάζει μόνο η κλάση από πίσω.

Αυτός ο οδηγός αφορά τη συγγραφή της κλάσης - το μέρος που το perltie αποκαλεί υλοποίηση. Η πλευρά των ενσωματωμένων (tie, tied, untie) και τα πλήρη μενού μεθόδων ανά τύπο μεταβλητής τεκμηριώνονται ήδη στη σελίδα αναφοράς του tie. Αυτός ο οδηγός παραπέμπει εκεί για τις υπογραφές και επικεντρώνεται σε ό,τι δεν διδάσκουν εκείνες οι σελίδες: πώς να φτιάξετε μια λειτουργική κλάση tie, τι πρέπει να επιστρέφει κάθε μέθοδος, και ακριβώς πότε την καλεί ο χρόνος εκτέλεσης.

Ποιο κεφάλαιο χρειάζεστε#

Κάθε τύπος μεταβλητής έχει τον δικό του κατασκευαστή και το δικό του σύνολο μεθόδων. Διαβάστε το κεφάλαιο που ταιριάζει με το sigil που έχετε μπροστά σας.

  • Βαθμωτά με tie - TIESCALAR, FETCH, STORE, DESTROY. Η μικρότερη διεπαφή tie· ξεκινήστε από εδώ για να μάθετε τη μορφή όλων των υπολοίπων.

  • Hash με tie - TIEHASH συν το πρωτόκολλο επανάληψης (FIRSTKEY / NEXTKEY), EXISTS, DELETE, CLEAR και SCALAR. Ο πλουσιότερος από τους τύπους δεδομένων.

  • Πίνακες με tie - TIEARRAY, το πρωτόκολλο μεγέθους (FETCHSIZE / STORESIZE / EXTEND) και οι μεταλλάκτες (PUSH, POP, SHIFT, UNSHIFT, SPLICE).

  • Filehandles με tie - TIEHANDLE και τα hooks I/O (PRINT, PRINTF, WRITE, READLINE, READ, GETC και άλλα συναφή).

Πώς είναι δομημένο κάθε κεφάλαιο#

Κάθε κεφάλαιο ακολουθεί την ίδια μορφή:

  • Το συμβόλαιο μέσα από παράδειγμα. Αντί να επαναδιατυπώνει το μενού μεθόδων (η σελίδα αναφοράς του tie παραθέτει ήδη κάθε υπογραφή), κάθε κεφάλαιο φτιάχνει μία πλήρη, εκτελέσιμη κλάση και εξηγεί κάθε μέθοδο καθώς εμφανίζεται.

  • Χρονισμός κλήσεων. Το μη προφανές μέρος του tie είναι πότε ο χρόνος εκτέλεσης επικαλείται κάθε hook - ποιος τελεστής πυροδοτεί ποια μέθοδο, σε ποιο περιβάλλον, με ποια ορίσματα. Κάθε κεφάλαιο το αναλύει αυτό.

  • Ελάχιστο βιώσιμο έναντι πλήρους. Οι λιγότερες μέθοδοι που μπορείτε να ορίσετε και να έχετε ακόμα ένα χρηστικό tie, και έπειτα το υπόλοιπο μενού και τι σας προσφέρει η καθεμία.

  • Ο εύκολος τρόπος. Κάθε τύπος δεδομένων συνοδεύεται από μια βασική κλάση Tie::* που υλοποιεί τις κουραστικές μεθόδους με όρους λίγων βασικών. Κληρονομήστε από αυτήν και υπερκαλύψτε μόνο τα ενδιαφέροντα hooks.

Τι κοστίζουν τα ties#

Κάθε λειτουργία πάνω σε μια μεταβλητή με tie είναι μια κλήση μεθόδου. Μια αναζήτηση σε hash με tie είναι μια αποστολή FETCH, εκεί που μια απλή αναζήτηση hash είναι μία και μόνη προσπέλαση μνήμης - αισθητά πιο αργή σε έναν σφιχτό βρόχο. Το tie είναι το σωστό εργαλείο όταν η έμμεση δρομολόγηση αξίζει τον κόπο (μια μεταβλητή που στηρίζεται σε αρχείο, μια υπολογιζόμενη τιμή, μια πρόσοψη καταγραφής), όχι όταν θέλετε απλώς ένα πιο φανταχτερό hash. Για μαζική εργασία πάνω σε έναν περιέκτη με tie, διαβάστε τον σε έναν απλό πίνακα ή hash μία φορά, επεξεργαστείτε, και γράψτε τα πίσω.

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

The tie mechanism is Perl 5.42’s own, so tie classes behave exactly as they do on upstream Perl.