如何从perl6中的数组或哈希创建方法

问题描述 投票:5回答:1

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

以下代码可以正常工作:

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。

任何人都可以解释我所缺少的,或者为什么结果与我期望的不同吗?

perl oop dynamic perl6 raku
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

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

© www.soinside.com 2019 - 2024. All rights reserved.