как создать методы из массивов или хешей в perl6

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

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

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.

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

5
задан Elizabeth Mattijsen 27 November 2019 в 19:26
поделиться

1 ответ

У Ракудо были некоторые проблемы из-за случайного чрезмерного использования лексических переменных, что могло вызвать вашу проблему (ссылка на код закрывается над $ 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

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

8
ответ дан 14 December 2019 в 04:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: