如何使用Raku mixins与运算符重载一起工作?

10

我需要帮助来确定是否可以通过使用does(或but)的mixin方式使数学运算符重载正常工作,以避免以下歧义错误...这个模块:

unit module Physics::Error;

role Error is export {
        has Real $.abs-error;
    
        method negate {
            ...
        }
    }
    
    multi prefix:<-> ( Error:D $right) is export {
        ...
    }

用于此脚本的方式...

use Physics::Error;

my $x = 12.5 does Error(0.5);
my $z = -$x;

对 'prefix:<->(Rat+{Physics::Error::Error})' 的调用不明确;所有这些签名都匹配: (Rat:D \a) (Physics::Error::Error:D $right)

我希望我的自定义运算符始终能够不含歧义地获胜,然后实现核心操作和误差计算,最后返回 (Rat+{Physics::Error::Error})。

总的来说,是要进行数学运算,同时执行简单的误差计算。


2
也许在你的多重定义中加上 is default 会有所帮助?https://docs.raku.org/type/Routine#index-entry-is_default_(Routine) - Elizabeth Mattijsen
2
你还没有说明你想如何处理这种歧义。有一些解决方法(例如,在你的模块中添加“is default”到前缀“-”操作声明,以强制Raku始终将你的模块声明作为默认值来处理歧义)。这是你想要的吗?嘿,Liz。快照。 :) - raiph
1
没错,is default就是这个作用 - 谢谢你们两位(附注:楼主编辑后更明确了目标) - librasteve
1个回答

5

为您的多选框添加一个 默认 特性:

    multi prefix:<-> ( Error:D $right) is export is default {

不过,注意jnthn在这里的评论

is default实际上是最后的选择,即使你可以使用mixin方法使其工作,你会发现结果非常慢,其中很大一部分原因是mixin会触发去优化(从专门和JIT编译代码回到解释器)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接