gpt4 book ai didi

oop - 在 mixin 中使用角色签名

转载 作者:行者123 更新时间:2023-12-01 18:55:25 27 4
gpt4 key购买 nike

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

#!/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] 可以使用 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] 确实可以通过-n[1] 起作用。知道这里发生了什么或者可以采取什么措施来解决这个问题吗?

最佳答案

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

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

因此,要实现此目的,我们需要延迟将 by-n 角色添加到 by-string 角色,直到 by- string角色组成。 afaics 目前的实现方式并非如此。

我很确定已经有一张票了。但为了确保这不会被遗漏,您也许应该打开一个 GitHub 问题。

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

希望能给你带来更好的消息。

关于oop - 在 mixin 中使用角色签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48145837/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com