【问题标题】:Wrong Signature.ACCEPTS after .wrap sub.wrap sub 之后的错误 Signature.ACCEPTS
【发布时间】:2018-10-25 12:57:06
【问题描述】:

在我包装一个子后,签名不接受包装前接受的捕获。

sub wr(:$a) {say $a};
my $sig-before = &wr.signature;
say $sig-before;               # (:$a)
say %(:a(3)) ~~ $sig-before;   # True

&wr.wrap(-> |c {callsame(c)});
my $sig-after = &wr.signature;
say $sig-after;                # (:$a)
say %(:a(3)) ~~ $sig-after;    # False
say %(:a(3)) ~~ $sig-before;   # False

say $sig-before.WHICH, ' ', $sig-after.WHICH; # Signature|140466574255752 Signature|140466574255752
say $sig-before eq $sig-after; # True
say %(:a(3)).Capture ~~ $sig-after; # 'Cannot invoke object with invocation handler in this context'
say $sig-after.ACCEPTS(%(:a(3)).Capture); # 'Cannot invoke object with invocation handler in this context'

我在 Rakudo 代码中看到:

multi method ACCEPTS(Signature:D: Capture $topic) {
    nqp::p6bool(nqp::p6isbindable(self, nqp::decont($topic)));
}

这可能是一个错误?或者,如果它是预期的,我该如何解决该行为,以及我如何在运行时了解我在具体情况下已经做了解决方法?

【问题讨论】:

    标签: raku


    【解决方案1】:

    可能是一个错误?

    我之前把某事称为 bug 时是错误的,但我会说 something in there is a bug,即使它只是一个 Less Than Awesome 错误消息 bug。

    我认为wraproast tests 相对较少(许多匹配项是误报;在结果中搜索wrap(wrap:)。如果您想使用 wrap,那么在这里要做的一件关键事情是添加一个烘烤测试,涵盖我们希望它在此处执行的操作,但它没有正确执行(假设它不仅仅是一个 Less Than Awesome 错误消息)。

    我认为 wrap 是 P6 官方最脆弱的功能之一:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      • 2013-03-12
      • 2020-12-28
      • 2013-09-09
      • 1970-01-01
      • 2012-08-20
      相关资源
      最近更新 更多