如何在perl6中从数组或散列创建方法

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.

任何人都可以解释我错过了什么,或者为什么结果与我的期望不同?

mor*_*itz 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;
Run Code Online (Sandbox Code Playgroud)

输出:

1
2
3
Run Code Online (Sandbox Code Playgroud)

请注意,不允许使用方法名称和括号之间的空格.