如何通过克隆填充Callable属性?

dax*_*xim 6 perl6

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 => [])
Run Code Online (Sandbox Code Playgroud)

但应该是

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

添加:bar(&!bar.clone)nextwith呼叫没有帮助.

rai*_*iph 8

nextwith"使用用户提供的参数调用下一个匹配的候选者".你只是:quuxnextwith通话中传递一个参数.

除非您添加显式的slurpy哈希参数(例如*%foo),否则所有方法都*%_在其签名中隐含:

say .signature given method ($a, $b) {} # (Mu: $a, $b, *%_)
Run Code Online (Sandbox Code Playgroud)

因此,默认情况下,所有命名参数都会被插入%_.一个常见的习惯是传递这些:

method clone { nextwith :quux(@!quux.clone), |%_ }
Run Code Online (Sandbox Code Playgroud)

上述将通过提供给参数$f.clone呼叫到nextwith"d clone呼叫.

添加:bar(&!bar.clone)nextwith呼叫没有帮助.

这将取代通话中:bar传递的参数$f.clone.在&!bar原始对象中包含的Callable对象类型.