2009-01-20 96 views
6

我有一個實現兩個(非正式)接口的對象的多態數組。我希望能夠與沿線的反射進行區分:如何確定一個對象是否在Perl中實現了一個方法?

if (hasattr(obj, 'some_method')) { 
    # `some_method` is only implemented by one interface. 
    # Now I can use the appropriate dispatch semantics. 
} else { 
    # This must be the other interface. 
    # Use the alternative dispatch semantics. 
} 

也許這樣的事情?:工作

if (*ref(obj)::'some_method') { 
    # ... 

我有困難的時候講的語法會嘗試調用一個子程序和何時它將返回一個子程序引用。我不太熟悉包符號表ATM,我只是試圖破解一些東西。 :-)

在此先感謝!

回答

16
use Scalar::Util qw(blessed); 
if(blessed($obj) and $obj->can('some_method')){ 

} 

「能」這裏是所有類別的UNIVERSAL繼承的方法。類可以重寫此方法,但它不是一個好主意。

此外, 「可以」 返回函數的引用,所以你可以做:

$foo->can('some_method')->($foo , @args); 

my $sub = $foo->can('some_method'); 
$foo->$sub(@args); 

編輯更新的鏈式語法,感謝Brian Phillips

+0

是否`可以`是某種方式的保留方法名稱,或者如果您實施它,是否恰好在腳中自拍? – cdleary 2009-01-20 10:08:58

相關問題