【问题标题】:How does one get a method reference when using Moose使用 Moose 时如何获得方法参考
【发布时间】:2011-02-02 01:57:36
【问题描述】:

我正在尝试弄清楚如何使用 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;

【问题讨论】:

  • 您的代码正在调用批处理存储方法,然后尝试断言返回值是代码引用。有关如何创建将调用您的方法的代码引用,请参阅上面的链接问题。

标签: perl moose


【解决方案1】:

The question I linked to above 详细介绍了在代码引用中封装方法调用时的各种选项。在您的情况下,我会将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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    • 2013-11-19
    相关资源
    最近更新 更多