5

我正在尝试向对象动态添加新方法。

以下代码可以正常工作:

use SomeClass;

my $obj = SomeClass.new;
my $blah = 'ping';
my $coderef = method { say 'pong'; }

$obj.^add_method($blah, $coderef);

$obj.ping;

这会按预期打印“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;

将打印 111 或 333。

谁能解释我缺少什么或为什么结果与我的预期不同?

4

1 回答 1

8

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;

输出:

1
2
3

请注意,方法名称和括号之间不允许有空格。

于 2010-07-07T18:06:38.287 回答