oop – 在mixins中使用角色签名
发布时间:2020-12-15 23:36:52 所属栏目:大数据 来源:网络整理
导读:在您想要混入的角色中使用给予角色的签名似乎存在问题.最小的例子: #!/usr/bin/env perl6role 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 ~ "→" ~ $.mul
在您想要混入的角色中使用给予角色的签名似乎存在问题.最小的例子:
#!/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-tor does by-string[2] {}; say mighty-tor.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 但是,字符串[$n = 1]的作用是由-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 然而,再一次,将它更改为角色by-string [Int $n = 1]确实可以通过-n [1]起作用.知道这里发生了什么或者可以做些什么来解决这个问题? 解决方法
我的结论是,这是一个错误,或至少是一个纽约州.
问题是,在角色实际组成一个类之前,by-string中的$n并未真正设置.但是,在by-string角色的编译时添加角色by-n.那时我们不知道组成by-string时会得到的值. 因此,为了实现这一点,我们需要延迟将by-n角色添加到by-string角色,直到组成by-string角色为止.这不是目前实施的方式,afaics. 我很确定已经有了这张票.但是为了确保这不会出现问题,你应该打开一个GitHub问题. 同时,我目前看到的唯一方法是手动将by-n角色的方法复制到by-string角色. 希望我有更好的消息给你. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |