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

untie#

ניתוק הקישור בין משתנה למחלקה הקשורה אליו.

untie מהפך tie קודם: לאחר הקריאה, VARIABLE חוזר להיות סקלר, מערך, האש, או מטפל קובץ פשוט, וקריאות וכתיבות עוקבות נוגעות באחסון הגולמי במקום להיות מנותבות דרך ה־FETCH, STORE, וחבריהם של החבילה הקשורה. אם המשתנה אינו קשור, untie הוא no-op.

תקציר#

untie VARIABLE

מה מקבלים בחזרה#

מחזיר ערך אמת אם המשתנה היה קשור והקישור הוסר, שקר אחרת. ערך ההחזרה נבדק לעתים רחוקות - אתרי הקריאה יודעים האם הם מפרקים tie שהם עצמם הקימו.

כתופעת לוואי, אם החבילה הקשורה מגדירה מתודה UNTIE, היא מופעלת על העצם הקשור לפני שהקישור נשמט. UNTIE מקבל את העצם וספירה של כל הפניות פנימיות נדרשות שמוחזקות אליו (ראו מקרי קצה להלן).

מה הוא עושה#

  1. איתור הקסם על VARIABLE ש־tie קודם התקין.

  2. אם החבילה הקשורה מספקת UNTIE, קריאה לו על העצם.

  3. הסרת הקסם כך שהמשתנה חוזר לאחסון רגיל.

  4. שחרור ההפניה של המפרש לעצם הקשור. העצם נהרס (מפעיל DESTROY אם מוגדר) ברגע שאין הפניות אחרות אליו שנותרות.

לאחר untie, כל ערך ש־tied החזיר קודם עבור המשתנה הזה כבר אינו תואם לקישור חי.

דוגמאות#

קשירת האש, שימוש בו, ואז שחרורו:

use Tie::File;
tie my @lines, 'Tie::File', 'log.txt' or die $!;
push @lines, "new entry";
untie @lines;                       # flush and release

נסיעה חזור דרך tied - תפסו את העצם הבסיסי כדי שתוכלו לקרוא לו מתודה לא־קשורה, ואז השמיטו את הקישור:

my $obj = tied %cache;
$obj->flush;
untie %cache;

untie על משתנה שמעולם לא נקשר אינו מזיק:

my %h;
untie %h;                           # no-op, no warning

הוו 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. הקישור מוסר בכל מקרה, אך אותן הפניות שמורות ממשיכות להצביע על העצם המנותק כעת. השמיטו את ההפניות האלה קודם, או קבלו שהן יראו עכשיו את העצם הלא־קשור בבידוד.

  • קריאה ל־untie על משתנה לא־קשור היא no-op. אין אזהרה, אין שגיאה, אין קריאת מתודה.

  • Tie של מטפל קובץ: untie *FH מסיר את ה־tie שהותקן על ידי tie *FH, $class, .... ה־glob הבסיסי וכל descriptor אמיתי של קובץ מאחוריו אינם מושפעים - untie אינו close.

  • UNTIE הוא אופציונלי: אם החבילה הקשורה אינה מגדירה אחד, הקישור פשוט מוסר. אל תסתמכו על UNTIE שירוץ; מחלקות קשורות רבות משמיטות אותו.

  • סדר הריסה: untie עצמו אינו קורא ל־DESTROY. העצם נהרס כאשר ה־refcount שלו מגיע לאפס, מה שעשוי להיות מיד לאחר untie (אם דבר אחר אינו מחזיק אותו) או מאוחר יותר (אם הקורא שמר עותק מ־tied).

  • משתנים קשורים שעברו local: tie שהותקן בתוך תחום על משתנה שעבר local מבוטל אוטומטית כשהתחום יוצא; אינכם זקוקים ל־untie מפורש, וקריאה לאחד אינה מזיקה.

הבדלים מהמקור#

תאימות מלאה עם Perl 5.42 המקורי.

ראו גם#

  • tie - מתקין את הקישור ש־untie מסיר; מציג את הקבוצה המלאה של שמות מתודות הוו של tie

  • tied - שליפת העצם הקשור כעת למשתנה קשור, בדרך כלל ממש לפני קריאה ל־untie עליו

  • bless - tie מבצע bless לעצם שניתן לו; untie אינו unbless, הוא רק מנתק את המשתנה ממנו

  • ref - בדיקה איזה סוג של הפניה tied החזיר לפני ההחלטה לבצע untie

  • local - אלטרנטיבה תחומה־בתחום כשרוצים שה־tie ייעלם ביציאה מהבלוק ללא untie מפורש