Perl 通过从";返回的ref调用方法;can";

Perl 通过从";返回的ref调用方法;can";,perl,Perl,通常,要从引用调用方法,它应该如下所示: $methodref->(@args) 但当从“can”返回的引用调用方法时,它似乎不一致 $methodref = $my_obj->can(my_method); $my_obj->$methodref(@args) if $methodref; # why it isn't $my_obj->$methodref->(@args)? 有人能解释一下吗 谢谢, CC原因是对象必须是传递给函数的第一个对象。如果您进行方

通常,要从引用调用方法,它应该如下所示:

$methodref->(@args)
但当从“can”返回的引用调用方法时,它似乎不一致

$methodref = $my_obj->can(my_method);
$my_obj->$methodref(@args) if $methodref; # why it isn't $my_obj->$methodref->(@args)?
有人能解释一下吗

谢谢,
CC

原因是对象必须是传递给函数的第一个对象。如果您进行方法调用,这将自动为您完成。但是
$methodref->($my_obj,@args)
也会起作用。

一旦
can
完成后,
返回的代码ref没有与之关联的对象。这就是为什么您仍然需要将对象用作发票的原因

请注意,这是危险的,因为不再保证这是应该在该对象上调用的方法。我想你可能会这样做:

$objmethref =  $my_obj->can("methname") && sub { $my_obj->methname(@_) };

# then later
$objmethref->(@args);
但我不确定您真正想做什么。

$methodref->(@args)
是函数调用,不是方法调用,因此不会自动传递对象

$my_obj->$methodref->(@args)
将调用$methodref,除对象参数外不使用任何参数,并将其返回值用作coderef,调用该值并将其传递给指定的参数

$my_obj->$methodref->(@args)

换句话说,它将调用不带参数的方法,并尝试将结果用作函数引用。这根本不是你想要的

最明显的称呼是

$methodref->($my_obj, @args)
但是Perl提供了一种语法,看起来像是一种方法调用

$my_obj->$methodref(@args)
$my_obj->$methodref(@args)