在混合中使用角色签名
Using role signature in mixins
在您要混入的角色中使用赋予角色的签名似乎有问题。最小示例:
#!/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("*");
这个 returns 错误,似乎表明 $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]
有效。知道这里发生了什么或者可以做些什么来解决这个问题吗?
我的结论是这是一个错误,或者至少是一个 NYI。
问题是 by-string
中的 $n
直到角色实际组成 class 才真正设置。但是,角色 by-n
的添加发生在 by-string
角色的编译时。什么时候我们不知道它在by-string
组成时会得到什么值。
因此,为了使其起作用,我们需要延迟将 by-n
角色添加到 by-string
角色,直到组成 by-string
角色。这不是目前的实施方式,afaics。
我很确定已经有票了。但要确保这不会被遗漏,您也许应该打开一个 GitHub 问题。
同时,我目前看到的唯一解决方法是将 by-n
角色的方法手动复制到 by-string
角色。
希望我有更好的消息告诉你。
在您要混入的角色中使用赋予角色的签名似乎有问题。最小示例:
#!/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("*");
这个 returns 错误,似乎表明 $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]
有效。知道这里发生了什么或者可以做些什么来解决这个问题吗?
我的结论是这是一个错误,或者至少是一个 NYI。
问题是 by-string
中的 $n
直到角色实际组成 class 才真正设置。但是,角色 by-n
的添加发生在 by-string
角色的编译时。什么时候我们不知道它在by-string
组成时会得到什么值。
因此,为了使其起作用,我们需要延迟将 by-n
角色添加到 by-string
角色,直到组成 by-string
角色。这不是目前的实施方式,afaics。
我很确定已经有票了。但要确保这不会被遗漏,您也许应该打开一个 GitHub 问题。
同时,我目前看到的唯一解决方法是将 by-n
角色的方法手动复制到 by-string
角色。
希望我有更好的消息告诉你。