как создавать методы из массивов или хэшей в perl6 - PullRequest
5 голосов
/ 07 июля 2010

Я пытаюсь динамически добавлять новые методы к объекту.

Следующий код работает просто отлично:

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.

Может ли кто-нибудь объяснить, чего мне не хватает или почему результаты отличаются от того, чего я ожидал?

1 Ответ

8 голосов
/ 07 июля 2010

У 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

Обратите внимание, что пробел между именем метода и круглыми скобками недопустим.

...