2011-02-02 61 views
2

我想弄清楚如何使用駝鹿獲得方法代碼參考。如何使用駝鹿獲得方法參考

下面是什麼,我試圖做一個例子:

use Modern::Perl; 

package Storage; 
use Moose; 

sub batch_store { 
    my ($self, $data) = @_; 
    ... store $data ... 
} 

package Parser; 
use Moose; 

has 'generic_batch_store' => (isa => 'CodeRef'); 

sub parse { 
    my $self = shift; 
    my @buf; 

    ... incredibly complex parsing code ... 
    $self->generic_batch_store(\@buf); 
} 

package main; 

$s = Storage->new; 

$p = Parser->new; 
$p->generic_batch_store(\&{$s->batch_store}); 

$p->parse; 

exit; 
+0

可能重複[如何將構造函數的代碼引用?](http://stackoverflow.com/questions/4229562/how-to-take-code-reference-to-constructor) – 2011-02-02 02:21:20

+1

您的代碼正在調用批處理存儲方法,然後嘗試斷言返回值是代碼引用。請參閱上面的鏈接問題以瞭解如何創建將調用您的方法的代碼引用。 – 2011-02-02 02:23:57

回答

2

The question I linked to above封裝在一個代碼裁判方法調用時進入各選項的細節。

my $storage = Storage->new; 

my $parser = Parser->new; 
$parser->generic_batch_store(sub {$storage->batch_store(@_)}); 

$parser->parse; 

$storage變更爲詞彙,這樣的代碼參考sub {$storage->batch_store(@_)}可以關閉了它:在你的情況,我會爲寫main包。添加到末尾的(@_)允許將參數傳遞給該方法。

我不是駝鹿的專家,但我相信你會需要調用的代碼與額外的解引用箭頭:

$self->generic_batch_store->(\@buf); 

這只是簡寫:中

($self->generic_batch_store())->(\@buf);