מחלקות ותכנות מונחה־עצמים

tied#

מחזיר את העצם המגבה משתנה קשור.

tied מוסר לכם את אותה הפניה ש־tie החזיר במקור כאשר VARIABLE נקשר למחלקה. דרך אותה הפניה תוכלו לקרוא למתודות ישירות על מימוש ה־tie - לעקוף את הדיספאץ« הרגיל של FETCH / STORE - וזו הדרך שבה מחלקות tie חושפות פעולות נוספות שאין להן תחביר סקלר / מערך / האש טבעי. אם 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 לעולם אינה blesses לחבילה עם overload לערך שקרי) כדי להבחין בין משתנה קשור ללא־קשור לפני קריאה למתודות על התוצאה.

הטריק של ״tie handle״#

tied היא הדרך הנתמכת היחידה לדבר עם מימוש ה־tie ישירות. כל מתודה על מחלקת ה־tie שאינה אחד הוואים הסטנדרטיים (FETCH, STORE, EXISTS, DELETE, CLEAR, FIRSTKEY, NEXTKEY, והמקבילים שלהם למערך / סקלר / מטפל) נגישה רק דרך העצם ש־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

סקלר, מערך, האש, או מטפל קובץ רגילים שמעולם לא נקשרו:

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 נפרדת.

  • מטפלי קובץ: tied *FH מחזיר את העצם עבור מטפל קובץ קשור (נקשר עם tie *FH, ...). glob שמעולם לא נקשר מניב undef כמו כל משתנה לא־קשור אחר.

  • tied אינו מבטל את הקשירה. הוא accessor טהור. כדי לשחרר את הקישור, קראו ל־untie. החזקת ההפניה המוחזרת על־ידי tied מעבר לנקודה שבה המשתנה לא־נקשר שומרת את עצם ה־tie חי, וזה מכוון - זו הדרך שבה אזהרות ה־untie על ״untie attempted while N inner references still exist״ מופעלות.

  • איבר קשור של אגרגט: כאשר איבר מערך או האש בודד הוא עצמו קשור (נפרד מ־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