加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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角色.

希望我有更好的消息给你.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读