7

在要混合的角色中使用赋予角色的签名似乎存在问题。最小的例子:

#!/usr/bin/env perl6

role by-n[$n=1] {
    method multiply(Str $str) { return $str x $n; }
}

role by-string[$n=1] does by-n[$n] {
    method whatever(Str $str) { return $n ~ "→" ~ $.multiply( $str ); }
}

class mighty-þor does by-string[2] {};

say mighty-þor.whatever("*");

这会返回一个错误,这似乎表明$n有一个Mu类型:

Cannot resolve caller infix:<x>(Str, Mu); none of these signatures match:
    ()
    ($x)
    ($s, Num:D $n)
    ($s, Any:D $n)
    ($s, Any:U $n)
    (Str:D $s, Int:D $repetition --> Str:D)
    (str $s, int $repetition --> str)
  in method multiply at composable-roles-fail.p6 line 4
  in method whatever at composable-roles-fail.p6 line 8
  in block <unit> at composable-roles-fail.p6 line 13

但是,role by-string[$n=1] does by-n[1]或任何其他数字都可以正常工作。尝试修复签名中的类型:

role by-n[Int $n=1] {
    method multiply(Str $str) { return $str x $n; }
}

role by-string[Int $n=1] does by-n[$n] {
    method whatever(Str $str) { return $n ~ "→" ~ $.multiply( $str ); }
}

产生不同的错误:

===SORRY!=== Error while compiling /home/jmerelo/Code/perl6/dev.to-code/perl6/composable-roles-fail.p6
No appropriate parametric role variant available for 'by-n'
at /home/jmerelo/Code/perl6/dev.to-code/perl6/composable-roles-fail.p6:11

同时,再次将其更改为role by-string[Int $n=1] does by-n[1]有效。知道这里发生了什么或者可以做些什么来解决这个问题?

4

1 回答 1

2

我的结论是这是一个错误,或者至少是一个 NYI。

问题在于,直到角色真正组合成一个类,才真正设置了$nin 。by-string但是,角色的添加by-n发生在角色的编译时by-string。那时我们不知道它在by-string组合时会得到什么值。

因此,要使其正常工作,我们需要延迟将by-n角色添加到by-string角色,直到by-string角色组合完成。这不是它目前的实施方式,afaics。

我很确定已经有这张票了。但是为了确保这不会落空,你也许应该打开一个 GitHub 问题。

同时,我目前看到的唯一方法是将by-n角色的方法手动复制到by-string角色中。

希望我有更好的消息告诉你。

于 2018-01-09T09:44:01.247 回答