.wrap子之后的Signature.ACCEPTS错误

时间:2018-10-25 12:57:06

标签: perl6

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

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)));
}

可能是错误吗?或者,如果发生这种情况,我该如何解决该问题;如何在运行时了解我在具体情况下已经采取了解决方法?

1 个答案:

答案 0 :(得分:5)

  

可能是错误吗?

在我称某事为错误之前,我一直是错的,但我会说其中是一个错误,即使它只是“不到真棒”错误消息错误。

我认为wrap的{​​{3}}相对较少(许多匹配都是误报;在结果中搜索wrap(wrap:)。如果要使用自动换行,此处要做的一件事是添加一个烤架测试,以覆盖我们在此处要执行的操作,以确保它未正确执行操作(假设它不仅是“令人惊叹的消息”)。

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