如何巧妙地调用名称在字符串中的方法?

dar*_*rch 3 perl6 raku

在Perl 5中,我可以说

my $meth = 'halt_and_catch_fire';
my $result = $obj->$meth();
Run Code Online (Sandbox Code Playgroud)

这对于迭代方法名称列表来执行操作非常方便.我已经设法搞清楚在Perl 6中我不能只说

my $result = $obj.$meth();
Run Code Online (Sandbox Code Playgroud)

有一件事的工作

my $result = $obj.^can($meth)[0]($obj);
Run Code Online (Sandbox Code Playgroud)

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

rai*_*iph 9

实际上,如果$meth包含一个(引用一个)Callable对象,比如一个方法,那么你可以写下你写的东西,Rakudo Perl 6编译器会接受它:

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

如果$ 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
Run Code Online (Sandbox Code Playgroud)

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