在我包装子后,签名不会在包装之前接受Capture接受.
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'
Run Code Online (Sandbox Code Playgroud)
我在Rakudo代码中看到:
multi method ACCEPTS(Signature:D: Capture $topic) {
nqp::p6bool(nqp::p6isbindable(self, nqp::decont($topic)));
}
Run Code Online (Sandbox Code Playgroud)
可能这是一个错误?或者,如果可以解决这种行为,我该如何处理该行为?如何在运行时理解我在具体情况下做了解决方法?
可能这是一个错误?
我以前也被错当我叫什么一个错误,但我要说的东西中有一个bug,即使它只是一个不到真棒错误消息的bug.
我认为wrap相对较少的烤肉测试(许多匹配是误报;搜索wrap(或wrap:结果).如果你想使用wrap,这里要做的一件事是添加一个覆盖测试,覆盖我们希望它在这里做的不正确的假设(假设它不仅仅是一个不那么令人敬畏的错误消息).
我认为wrap是最脆弱的官方P6功能之一: