溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Perl析構(gòu)函數(shù)如何使用

發(fā)布時(shí)間:2021-07-14 14:23:52 來(lái)源:億速云 閱讀:209 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

Perl析構(gòu)函數(shù)如何使用,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

Perl析構(gòu)函數(shù)

一、Perl析構(gòu)函數(shù)簡(jiǎn)介

Perl跟蹤對(duì)象的鏈接數(shù)目,當(dāng)某對(duì)象的***一個(gè)應(yīng)用釋放到內(nèi)存池時(shí),該對(duì)象就自動(dòng)銷(xiāo)毀。對(duì)象的析構(gòu)發(fā)生在代碼停止后,腳本將要結(jié)束時(shí)。對(duì)于全局變量而言,析構(gòu)發(fā)生在***一行代碼運(yùn)行之后。
如果你想在對(duì)象被釋放之前獲取控制權(quán),可以定義DESTROY()方法。DESTROY()在對(duì)象將釋放前被調(diào)用,使你可以做一些清理工作。DESTROY()函數(shù)不自動(dòng)調(diào)用其它DESTROY()函數(shù),Perl不做內(nèi)置的析構(gòu)工作。如果構(gòu)造函數(shù)從基類多次bless,DESTROY()可能需要調(diào)用其它類的DESTROY()函數(shù)。當(dāng)一個(gè)對(duì)象被釋放時(shí),其內(nèi)含的所有對(duì)象引用自動(dòng)釋放、銷(xiāo)毀。
一般來(lái)說(shuō),不需要定義DESTROY()函數(shù),如果需要,其形式如下:

subDESTROY{  #  #Addcodehere.  #  }

因?yàn)槎喾N目的,Perl使用了簡(jiǎn)單的、基于引用的垃圾回收系統(tǒng)。任何對(duì)象的引用數(shù)目必須大于零,否則該對(duì)象的內(nèi)存就被釋放。當(dāng)程序退出時(shí),Perl的一個(gè)徹底的查找并銷(xiāo)毀函數(shù)進(jìn)行垃圾回收,進(jìn)程中的一切被簡(jiǎn)單地刪除。在UNIX類的系統(tǒng)中,這像是多余的,但在內(nèi)嵌式系統(tǒng)或多線程環(huán)境中這確實(shí)很必要。

二、Perl析構(gòu)函數(shù)之繼承

類方法通過(guò)@ISA數(shù)組繼承,變量的繼承必須明確設(shè)定。下例創(chuàng)建兩個(gè)類Bean.pm和Coffee.pm,其中Coffee.pm繼承Bean.pm的一些功能。此例演示如何從基類(或稱超類)繼承實(shí)例變量,其方法為調(diào)用基類的構(gòu)造函數(shù)并把自己的實(shí)例變量加到新對(duì)象中。
Bean.pm代碼如下:

packageBean;  requireExporter;  @ISA=qw(Exporter);  @EXPORT=qw(setBeanType);   subnew{  my$type=shift;  my$this={};  $this->{'Bean'}='Colombian';  bless$this,$type;  return$this;  }   #  #Thissubroutinesetstheclassname  subsetBeanType{  my($class,$name)=@_;  $class->{'Bean'}=$name;  print"Setbeanto$name\n";  }  1;

此類中,用$this變量設(shè)置一個(gè)匿名哈希表,將'Bean'類型設(shè)為'Colombian'。方法setBeanType()用于改變'Bean'類型,它使用$class引用獲得對(duì)對(duì)象哈希表的訪問(wèn)。

三、Perl析構(gòu)函數(shù)之子類方法的重載

繼承的好處在于可以獲得基類輸出的方法的功能,而有時(shí)需要對(duì)基類的方法重載以獲得更具體或不同的功能。下面在Bean.pm類中加入方法printType(),代碼如下:

subprintType{  my$class=shift@_;  print"ThetypeofBeanis$class->{'Bean'}\n";  }

然后更新其@EXPORT數(shù)組來(lái)輸出:
@EXPORT=qw(setBeanType,printType);
現(xiàn)在來(lái)調(diào)用函數(shù)printType(),有三種調(diào)用方法:

$cup->Coffee::printType();  $cup->printType();  $cup->Bean::printType();

輸出分別如下:

ThetypeofBeanisMixed
ThetypeofBeanisMixed
ThetypeofBeanisMixed
為什么都一樣呢?因?yàn)樵谧宇愔袥](méi)有定義函數(shù)printType(),所以實(shí)際均調(diào)用了基類中的方法。如果想使子類有其自己的printType()函數(shù),必須在Coffee.pm類中加以定義:

#  #Thisroutineprintsthetypeof$class->{'Coffee'}  #  subprintType{  my$class=shift@_;  print"ThetypeofCoffeeis$class->{'Coffee'}\n";  }

然后更新其@EXPORT數(shù)組:
@EXPORT=qw(setImports,declareMain,closeMain,printType);
現(xiàn)在輸出結(jié)果變成了:

ThetypeofCoffeeisInstant
ThetypeofCoffeeisInstant
ThetypeofBeanisMixed
現(xiàn)在只有當(dāng)給定了Bean::時(shí)才調(diào)用基類的方法,否則直接調(diào)用子類的方法。
那么如果不知道基類名該如何調(diào)用基類方法呢?方法是使用偽類保留字SUPER::。在類方法內(nèi)使用語(yǔ)法如:$this->SUPER::function(...argumentlist...);,它將從@ISA列表中尋找。剛才的語(yǔ)句用SUPER::替換Bean::可以寫(xiě)為$cup->SUPER::printType();,其結(jié)果輸出相同,為:

ThetypeofBeanisMixed

四、Perl析構(gòu)函數(shù)中Perl類和對(duì)象的一些注釋

OOP的***好處就是代碼重用。OOP用數(shù)據(jù)封裝來(lái)隱藏一些復(fù)雜的代碼,Perl的包和模塊通過(guò)my函數(shù)提供數(shù)據(jù)封裝功能,但是Perl并不保證子類一定不會(huì)直接訪問(wèn)基類的變量,這確實(shí)減少了數(shù)據(jù)封裝的好處,雖然這種動(dòng)作是可以做到的,但卻是個(gè)很壞的編程風(fēng)格。
注意:
1、一定要通過(guò)方法來(lái)訪問(wèn)類變量。
2、一定不要從模塊外部直接訪問(wèn)類變量。

當(dāng)編寫(xiě)包時(shí),應(yīng)該保證方法所需的條件已具備或通過(guò)參數(shù)傳遞給它。在包內(nèi)部,應(yīng)保證對(duì)全局變量的訪問(wèn)只用通過(guò)方法傳遞的引用來(lái)訪問(wèn)。對(duì)于方法要使用的靜態(tài)或全局?jǐn)?shù)據(jù),應(yīng)該在基類中用local()來(lái)定義,子類通過(guò)調(diào)用基類來(lái)獲取。有時(shí),子類可能需要改變這種數(shù)據(jù),這時(shí),基類可能就不知道怎樣去尋找新的數(shù)據(jù),因此,這時(shí)***定義對(duì)該數(shù)據(jù)的引用,子類和基類都通過(guò)引用來(lái)改變?cè)摂?shù)據(jù)。

***,你將看到如下方式來(lái)使用對(duì)象和類:
usecoffee::Bean;
這句語(yǔ)句的含義是“在@INC數(shù)組所有目錄的Coffee子目錄來(lái)尋找Bean.pm”。如果把Bean.pm移到./Coffee目錄,上面的例子將用這一use語(yǔ)句來(lái)工作。這樣的好處是有條理地組織類的代碼。再如,下面的語(yǔ)句:
useAnother::Sub::Menu;

關(guān)于Perl析構(gòu)函數(shù)如何使用問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI