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

时间:2019-02-11 14:55:50

标签: 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 => [])

但应该是

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

:bar(&!bar.clone)添加到nextwith调用中没有帮助。

1 个答案:

答案 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类型的对象。