通过“can”返回的ref调用方法

时间:2011-05-10 00:37:42

标签: 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

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

can返回的CODE引用在can完成后没有与之关联的对象。这就是为什么你仍然需要使用一个对象作为一个调用者。

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

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

# then later
$objmethref->(@args);

但我不确定你真正想做什么。

答案 2 :(得分:1)

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

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

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

调用它的明显方法是

$methodref->($my_obj, @args)

但Perl提供了一种看起来像方法调用的语法。

$my_obj->$methodref(@args)

答案 3 :(得分:0)

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

$my_obj->$methodref->(@args)将调用$ methodref而不使用object参数以外的参数,并使用其返回值作为coderef,调用它并将指定的args传递给它。