Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从perl6中的数组或哈希创建方法_Perl_Oop_Dynamic_Raku - Fatal编程技术网

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

如何从perl6中的数组或哈希创建方法,perl,oop,dynamic,raku,Perl,Oop,Dynamic,Raku,我正在尝试向对象dynamicali添加新方法 以下代码工作正常: 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;

我正在尝试向对象dynamicali添加新方法

以下代码工作正常:

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


有人能解释一下我遗漏了什么或者为什么结果与我预期的不同吗?

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
注意,方法名和括号之间不允许有空格