在Perl 5中,我可以说

my $meth = 'halt_and_catch_fire';
my $result = $obj->$meth();

这对于遍历方法名称列表以完成工作非常方便。我已经设法弄清楚,在Perl 6中我不能只是说
my $result = $obj.$meth();

起作用的一件事是
my $result = $obj.^can($meth)[0]($obj);

但这似乎完全可怕。我应该怎么做?

最佳答案

实际上,如果$meth包含一个(对a的)可调用对象(对方法的引用),则可以编写所写的内容,并且Rakudo编译器将接受它:

my $result = $obj.$meth;   # call the Callable in $meth, passing $obj as invocant
my $result = $obj.$meth(); # same

如果$ meth不是Callable的话,Rakudo会抱怨(在编译时)。

听起来您想要的是能够仅以字符串形式提供方法名称。在那种情况下,将该字符串放入$ meth并编写:
my $result = $obj."$meth"(); # use quotes if $meth is method name as a string
my $result = $obj."$meth";   # SORRY! Rakudo complains if you don't use parens

有关更多信息,请参见the Fancy method calls section of the Objects design document

09-25 21:19