91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Perl析構函數如何使用

發布時間:2021-07-14 14:23:52 來源:億速云 閱讀:217 作者:Leah 欄目:開發技術

Perl析構函數如何使用,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

Perl析構函數

一、Perl析構函數簡介

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

subDESTROY{  #  #Addcodehere.  #  }

因為多種目的,Perl使用了簡單的、基于引用的垃圾回收系統。任何對象的引用數目必須大于零,否則該對象的內存就被釋放。當程序退出時,Perl的一個徹底的查找并銷毀函數進行垃圾回收,進程中的一切被簡單地刪除。在UNIX類的系統中,這像是多余的,但在內嵌式系統或多線程環境中這確實很必要。

二、Perl析構函數之繼承

類方法通過@ISA數組繼承,變量的繼承必須明確設定。下例創建兩個類Bean.pm和Coffee.pm,其中Coffee.pm繼承Bean.pm的一些功能。此例演示如何從基類(或稱超類)繼承實例變量,其方法為調用基類的構造函數并把自己的實例變量加到新對象中。
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變量設置一個匿名哈希表,將'Bean'類型設為'Colombian'。方法setBeanType()用于改變'Bean'類型,它使用$class引用獲得對對象哈希表的訪問。

三、Perl析構函數之子類方法的重載

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

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

然后更新其@EXPORT數組來輸出:
@EXPORT=qw(setBeanType,printType);
現在來調用函數printType(),有三種調用方法:

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

輸出分別如下:

ThetypeofBeanisMixed
ThetypeofBeanisMixed
ThetypeofBeanisMixed
為什么都一樣呢?因為在子類中沒有定義函數printType(),所以實際均調用了基類中的方法。如果想使子類有其自己的printType()函數,必須在Coffee.pm類中加以定義:

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

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

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

ThetypeofBeanisMixed

四、Perl析構函數中Perl類和對象的一些注釋

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

當編寫包時,應該保證方法所需的條件已具備或通過參數傳遞給它。在包內部,應保證對全局變量的訪問只用通過方法傳遞的引用來訪問。對于方法要使用的靜態或全局數據,應該在基類中用local()來定義,子類通過調用基類來獲取。有時,子類可能需要改變這種數據,這時,基類可能就不知道怎樣去尋找新的數據,因此,這時***定義對該數據的引用,子類和基類都通過引用來改變該數據。

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

關于Perl析構函數如何使用問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

泰兴市| 临清市| 专栏| 麻栗坡县| 沧源| 宝清县| 易门县| 邹城市| 长沙市| 天峻县| 灵寿县| 台州市| 榆社县| 泰和县| 江门市| 桂阳县| 黑河市| 四平市| 连山| 历史| 迭部县| 马龙县| 松溪县| 凉城县| 元谋县| 微山县| 山西省| 神池县| 通山县| 惠水县| 屏南县| 安新县| 莲花县| 鲁甸县| 西藏| 辽阳市| 庄浪县| 定南县| 县级市| 嘉义县| 海城市|