【问题标题】:how to create methods from arrays or hashes in perl6如何在 perl6 中从数组或哈希创建方法
【发布时间】:2010-07-07 15:55:55
【问题描述】:

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

以下代码可以正常工作:

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 raku


    【解决方案1】:

    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
    

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

    【讨论】:

      猜你喜欢
      • 2011-04-20
      • 2010-09-29
      • 1970-01-01
      • 2011-09-20
      • 2018-04-11
      • 2011-05-08
      • 2012-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多