5

オブジェクトに動的に新しいメソッドを追加しようとしています。

次のコードは問題なく機能します。

use SomeClass;

my $obj = SomeClass.new;
my $blah = 'ping';
my $coderef = method { say 'pong'; }

$obj.^add_method($blah, $coderef);

$obj.ping;

これは期待どおりに「ポン」を出力しますが、以下は期待どおりに機能しません。

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のいずれかを印刷します。

誰かが私が欠けているもの、または結果が私が期待していたものと異なる理由を説明できますか?

4

1 に答える 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

メソッド名と括弧の間の空白は許可されないことに注意してください。

于 2010-07-07T18:06:38.287 に答える