2012-05-28 26 views
7

perldoc perlobj(在這個優秀的answer引用):通過「 - >」調用方法與傳遞類/對象作爲第一個參數的區別究竟是什麼?

my $fred = Critter->find("Fred"); 
$fred->display("Height", "Weight"); 

...上面的代碼主要是等價於:

my $fred = Critter::find("Critter", "Fred"); 
Critter::display($fred, "Height", "Weight"); 

究竟有什麼區別,撇開錯誤檢查以確保第一個參數是一個有福的對象或一個有效的類名?例如。爲什麼它大多是但不完全一樣?

+2

「撇開錯誤檢查,以確保第一個參數是一個幸福的對象或有效的類名」 - 這是一個相當大的財產放在一邊,不是嗎? – Mat

+0

@Mat - 正確。由於其顯而易見性,我沒有把它放在外面,而不是因爲缺乏重要性。 – DVK

回答

15

Say Critter是一個子類,它沒有定義finddisplay或兩者!函數不是一對一的,因爲硬連線的子調用不執行方法查找,正如perlobj文檔解釋的那樣。

Perl如何知道子程序在哪個包中?通過查看箭頭的左側(其必須是包名或對對象的引用),,即,這是一種已被祝福的包。無論哪種方式,這是Perl開始尋找的包。如果該包沒有該名稱的子例程,Perl就會開始在該包的任何基類中查找它,等等。

用一個子,你必須確切地知道它是靜態的,或者你的程序將會是die。要調用方法,只需指定從哪裏開始搜索它。

例如:

#! /usr/bin/env perl 

package Critter; 
sub new { bless {}, shift } 
sub display { ref($_[0]) . " display" } 

package SuperCritter; 
@SuperCritter::ISA = qw/ Critter /; 

package main; 
my $super = SuperCritter->new; 

# one of these things is not like the other 
warn $super->display; 
warn Critter::display($super); 
warn SuperCritter::display($super); 

輸出:

SuperCritter display at ./call-demo line 14. 
SuperCritter display at ./call-demo line 15. 
Undefined subroutine &SuperCritter::display called at ./call-demo line 16.
+0

因此,調用'Critter_subclass :: display'會導致運行時錯誤? (通過爲理論解釋提供具體的例子,可能會改善這個已經很好的答案)。 – DVK

+0

@DVK好的建議!更新。 –

+2

一個優秀的答案,我upvoted,但它設法證明,問題的答案主要是繼承,沒有使用單詞繼承。 :) – DavidO

相關問題