perl - 如何从 perl6 中的数组或散列创建方法

标签 perl oop dynamic raku

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

以下代码工作正常:

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

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

关于perl - 如何从 perl6 中的数组或散列创建方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3196539/

相关文章:

java - 分词和排列之间的时间复杂度差异

perl - Perl中的函数组成

linux - 如果我安装了 SIGCHLD 处理程序,对特定 pid 的 *blocking* 等待是否仍然有效?

java - 在类里面以正确的方式进行设计时遇到问题

JavaScript 从自定义对象访问元素

html - 调整 CSS 元素以消除叠加

php - 读取动态创建的字段

html - 为什么我用Perl的split函数没有split?

linux - 减去小时和分钟

javascript - javascript中原型(prototype)属性如何从父类(super class)委托(delegate)给子类