获取Moose对象中子例程的引用

时间:2014-08-25 18:50:12

标签: perl

是否可以从Perl中的Moose对象获取子例程引用?例如:

package A;
use Moose;
1;

sub mm {
  print "Hello\n";
}

然后我创建一个A对象:

use warnings;
use strict;
use A;

my $o=A->new();
my $sub=\&{$o->mm};
$sub->();

这不起作用。它给出了错误:

Undefined subroutine &main::1 

如果我知道$oA个对象,我当然可以使用my $sub=\&A::mm;来解决此问题。 但是在这种情况下,我只被赋予$o,是否可以提取对函数mm的引用?

2 个答案:

答案 0 :(得分:2)

您正在使用的代码调用$o->mm并将结果视为子引用(符号或其他),取消引用它,并创建对它的新引用。

如果您想要一个调用$o->mm的子广告素材,则需要制作一个。

my $sub = sub { $o->mm };

或者,如果sub接收到的args应该传递给$o->mm

my $sub = sub { $o->mm(@_) };

答案 1 :(得分:1)

参考方法与面向对象设计的方法相悖,但如果使用UNIVERSAL::can,你可以做得很好。 UNIVERSAL是所有内容继承的最终基类,并且它是为每个Perl程序隐式定义的。

保持模块不变(虽然use Moose目前没有效果)并将程序更改为

use strict;
use warnings;

use A;

my $o = A->new;
my $sub = $o->can('mm');
$sub->();

<强>输出

Hello

但请记住,通常会编写一个方法来指望类/包名(对于类方法)或对象引用(对象方法)作为其第一个参数。

由于这种方式绕过了Perl的方法调用语法,你必须自己做,所以调用看起来应该是

$sub->($o)

虽然在这种情况下mm不是真正的方法,所以它并不关心你传递给它的是什么。