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
.