Как заполнить атрибут Callable через клон? - PullRequest
0 голосов
/ 11 февраля 2019
class Foo {
    has &.bar;
    has @.quux is required;
    method clone { nextwith :quux(@!quux.clone) };
    # as per <https://docs.perl6.org/type/Mu#method_clone>
};
my $f = Foo.new(quux => []);
my $f-clone = $f.clone(bar => sub { die });
# Foo.new(bar => Callable, quux => [])

, но должно быть

Foo.new(bar => sub { #`(Sub|94789546929784) ... }, quux => [])

Добавление :bar(&!bar.clone) к вызову nextwith не помогает.

1 Ответ

0 голосов
/ 11 февраля 2019

nextwith "вызывает следующего подходящего кандидата с аргументами, предоставленными пользователями".Вы только передаете аргумент :quux в вызове nextwith.

Если вы не добавите явный параметр хеш-кода (например, *%foo), все методы имеют неявный *%_ в своей сигнатуре:

say .signature given method ($a, $b) {} # (Mu: $a, $b, *%_)

Таким образом, по умолчанию все именованные аргументы добавляются в %_.Обычная идиома заключается в том, чтобы передать их:

method clone { nextwith :quux(@!quux.clone), |%_ }

Выше будут передаваться аргументы, предоставленные для вызова $f.clone, на вызов nextwith 'd clone.

Добавление :bar(&!bar.clone) к вызову nextwith не помогает.

Это будет вместо аргумента :bar, переданного в вызове $f.clone.&!bar в исходном объекте содержит объект типа Callable.

...