3

在 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);

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

4

1 回答 1

9

实际上,如果$meth包含一个(对一个)可调用对象(例如方法)的引用,那么您可以编写您所写的内容,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

有关详细信息,请参阅Objects设计文档Fancy 方法调用部分

于 2014-12-25T04:59:57.677 回答