代码之家  ›  专栏  ›  技术社区  ›  daxim Fayland Lam

如何通过克隆填充可调用属性?

  •  4
  • daxim Fayland Lam  · 技术社区  · 6 年前
    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 回复  |  直到 6 年前
        1
  •  5
  •   raiph    6 年前

    nextwith “使用用户提供的参数调用下一个匹配的候选对象”。你只是路过 :quux 论证中 NeXT 打电话。

    除非添加一个显式的slurpy散列参数(例如 *%foo )所有方法都有一个隐式 *%_ 签字:

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

    因此,默认情况下,所有命名的参数都被转换成 %_ . 一个常见的成语是传递这些信息:

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

    上面的参数将传递给 $f.clone 打电话到 NeXT D clone 打电话。

    添加 :bar(&!bar.clone) NeXT 打电话没用。

    那将是 而不是 这个 :bar 传入的参数 $F.克隆 打电话。这个 &!bar 在原始对象中包含 Callable 类型对象。

    推荐文章