在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);
但这似乎非常可怕。我该怎么办呢?
答案 0 :(得分:8)
实际上,如果$meth
包含一个(引用一个)可调用对象(如方法),那么你可以写下你写的内容,Rakudo Perl 6编译器会接受它:
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。