Неправильная подпись. ПРИНИМАЕТ после .wrap sub - PullRequest
0 голосов
/ 25 октября 2018

После того, как я завернул сабвуфер, подпись не ПРИНИМАЕТ захват, принятый перед переносом.

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 голосов
/ 25 октября 2018

Возможно, это ошибка?

Раньше я ошибался, когда называю что-то ошибкой, но я бы сказал, что что-то , есть ошибка, даже если это просто ошибка сообщения об ошибке Less Than Awesome.

Я думаю, что wrap имеет относительно немного жареных тестов (многие совпадения являются ложными срабатываниями; ищите wrap( или wrap: в результатах).Если вы хотите использовать wrap, вам нужно сделать один ключевой момент - добавить тест roast, который будет описывать то, что мы хотим, чтобы он делал не правильно (при условии, что это не просто сообщение об ошибке Less Than Awesome).

Я думаю, что wrap - одна из самых хрупких официальных функций P6:

...