Julia:模块中重载运算符的范围

斯图尔特

我正在尝试重载算术运算符,但这会导致其他使用该运算符的模块出现问题。如何限制重载的范围,以便只有定义了重载的模块才能使用它。我的模块调用的较低级别的模块和调用我的模块的较高级别的模块都不应该看到或受操作员重载影响。

最小的工作示例:

# This works as expected without overloads being declared.
a = Date(2018,1,1)
b = Date(2020,3,2)
a:Dates.Day(10):b

现在,当运算符重载时,会出现错误,因为Base.range.jl使用了-(a :: Date,b :: Date)的内置定义。

import Base.-
function -(a::Date, b::Date)
    return (Dates.days(a) -Dates.days(b))/ 365.2422
end
a:Dates.Day(10):b

一个明显的解决方法似乎是替换为import Base.-import MyPackageName.-但这不能解决问题。

BogumiłKamiński

如果我正确理解您的问题,则不导入任何内容应该可以完全满足您的要求。在这种情况下,将在您的模块中定义一个功能,并且该功能仅在该模块中可见。唯一的窍门是-在函数定义中使用应该在-from中使用的函数Base这是一个简单的解决方法。在模块中输入以下定义:

-(a,b) = Base.:-(a,b)

function -(a::Date, b::Date)
    return (Dates.days(a) -Dates.days(b))/ 365.2422
end

现在除非-您的模块-Base的两个参数都为Date- 否则您的模块中的行为将与-中相同,然后您自己的定义就会生效(但仅在您定义模块的模块中)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章