mat*_*ull 5 oop perl dynamic perl6 raku
我试图动态地向对象添加新方法.
以下代码工作正常:
use SomeClass;
my $obj = SomeClass.new;
my $blah = 'ping';
my $coderef = method { say 'pong'; }
$obj.^add_method($blah, $coderef);
$obj.ping;
Run Code Online (Sandbox Code Playgroud)
这会按预期打印"pong",而以下内容将无法正常工作:
use SomeClass;
my $obj = SomeClass.new;
my %hash = one => 1, two => 2, three => 3;
for %hash.kv -> $k, $v {
my $coderef = method { print $v; }
$obj.^add_method($k, $coderef);
}
$obj.one;
$obj.two;
$obj.three;
Run Code Online (Sandbox Code Playgroud)
将打印111或333.
任何人都可以解释我错过了什么,或者为什么结果与我的期望不同?
Rakudo有一些问题意外地过度分享词汇变量,这可能导致你的问题(代码引用结束$v
).使用Rakudo的当前开发版本(因此在下一个版本中,以及在"Rakudo Star"版本中),此代码可用:
class SomeClass { };
my $obj = SomeClass.new;
my %hash = one => 1, two => 2, three => 3;
for %hash.kv -> $k, $v {
my $coderef = method { say $v; }
$obj.^add_method($k, $coderef);
}
$obj.one;
$obj.two;
$obj.three;
Run Code Online (Sandbox Code Playgroud)
输出:
1
2
3
Run Code Online (Sandbox Code Playgroud)
请注意,不允许使用方法名称和括号之间的空格.