是否可以从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
如果我知道$o
是A
个对象,我当然可以使用my $sub=\&A::mm;
来解决此问题。
但是在这种情况下,我只被赋予$o
,是否可以提取对函数mm
的引用?
答案 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
不是真正的方法,所以它并不关心你传递给它的是什么。