通常,要从其引用中调用方法,它应该如下所示:
$methodref->(@args)
但是当从“can”返回的引用调用方法时,它似乎不一致。
$methodref = $my_obj->can(my_method);
$my_obj->$methodref(@args) if $methodref; # why it isn't $my_obj->$methodref->(@args)?
有人可以对此有所了解吗?
谢谢, CC
答案 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传递给它。