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
调用中没有帮助。
答案 0 :(得分:8)
nextwith
“使用用户提供的参数调用下一个匹配的候选对象”。您只会在:quux
调用中传递一个nextwith
参数。
除非您添加显式的稀疏哈希参数(例如*%foo
),否则所有方法在其签名中均具有隐式*%_
:
say .signature given method ($a, $b) {} # (Mu: $a, $b, *%_)
因此,默认情况下,所有命名参数都包含在%_
中。一个常见的成语是将这些传递给:
method clone { nextwith :quux(@!quux.clone), |%_ }
以上内容将传递给$f.clone
调用的参数传递到nextwith
的{{1}}调用上。
将
clone
添加到:bar(&!bar.clone)
调用中没有帮助。
这将是而不是在nextwith
调用中传递的:bar
参数。原始对象中的$f.clone
包含&!bar
类型的对象。