【问题标题】:How can Raku mixins work with operator overloading?Raku mixin 如何与运算符重载一起工作?
【发布时间】:2021-11-03 01:31:03
【问题描述】:

如果可以通过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})' 的模糊调用;这些签名都匹配: (大鼠:D \a) (Physics::Error::Error:D $right)

我希望我的自定义运算符始终明确获胜,然后让它实现核心操作和错误计算,然后返回 (Rat+{Physics::Error::Error})。

大局是进行数学运算,同时执行简单的误差计算。

【问题讨论】:

  • 也许你的 multi 上的 is default 会有所帮助? docs.raku.org/type/Routine#index-entry-is_default_(Routine)
  • 你还没有说你想对歧义做什么。有一些方法可以解决它(例如,将is default 添加到模块中的前缀- op 声明中,以强制Raku 在出现歧义时始终将模块的op 声明视为默认值)。那是你要的吗?呵呵。嗨,丽兹。折断。 :)
  • 是的 is default 完成了这项工作 --- 谢谢你们(PS OP 已编辑以更清楚地说明目标)

标签: raku units-of-measurement


【解决方案1】:

is default 特征添加到您的多重:

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

也就是说,请注意 jnthn 的评论 here

is default 确实是不得已而为之,即使你可以使用 mixin 方法让它工作,你会发现结果非常慢,这在很大程度上是因为 mixins 触发了去优化(脱离了专门的和JIT 编译后的代码返回解释器)。

【讨论】:

    猜你喜欢
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    • 1970-01-01
    • 2011-11-24
    • 2013-07-10
    相关资源
    最近更新 更多