如何从带有子名称的变量调用子?

Jim*_*ger 6 string subroutine raku

给出以下代码:

sub foo {
    say 'Hello';
}
my $call_me = 'foo';
Run Code Online (Sandbox Code Playgroud)

我如何调用sub foousing $call_me

jjm*_*elo 9

使用:

::( "&" ~ $call_me )()
Run Code Online (Sandbox Code Playgroud)

::访问当前包中的符号表;subs 与 sigil 一起存储在该符号表中,&这就是为什么我们必须将~名称与该名称连接起来才能从字符串到函数;该符号表将标识符映射到实际函数。

对于方法来说,这更容易:

my $method-name = "foo";
$object."$method-name"();
Run Code Online (Sandbox Code Playgroud)

请注意,您可以在其中创建一个名称"",它不必只是一个变量名称。

另请注意,()在这种情况下是必需的。

  • 您应该使用 `&::($name)` 而不是 `::("&" ~ $name)` (3认同)
  • 谢谢你,特别是你的解释! (2认同)
  • 你还得感谢@elizabeth-mattijsen :-) (2认同)
  • 很好的答案!我只是注意到几个变体 (i) ```my $c = '&foo'; ::(~$c)()``` 在名称中嵌入 ```&``` 并使用 str concat (~) 作为前缀将 $c 强制转换为 Str 或 (ii) ```my $d = '富''; ::("&$d")()``` 使用双引号将 (&) 插入前面。 (2认同)