使用Moose时如何获得方法引用

时间:2011-02-02 01:57:36

标签: perl moose

我正在试图弄清楚如何使用Moose获取方法代码参考。

下面是我正在尝试做的一个例子:

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;

1 个答案:

答案 0 :(得分:2)

The question I linked to above详细介绍了在代码ref中封装方法调用时的各种选项。在您的情况下,我会将main包写为:

my $storage = Storage->new;

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

$parser->parse;

$storage更改为词汇,以便代码引用sub {$storage->batch_store(@_)}可以关闭它。添加到末尾的(@_)允许将参数传递给方法。

我不是Moose专家,但我相信您需要使用额外的解除引用箭头来调用代码:

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

这只是简写:

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