如何在 Julia 中本地扩展 Base 运算符在模块中

问题描述


我不知道如何在本地扩展 Base 运算符,我找不到任何相关信息。
我显然可以在全局范围(REPL 或模块)中重新定义它:

import Base.-

-(x,y::Nothing) = nothing
-(x::Nothing,y) = nothing

但我想让它在我的模块中保持私有,而不是自动导出到全局范围,以免污染它,并且仍然能够在模块中的某些函数中使用扩展。
我尝试了 let ... end 块,甚至在我的模块函数中重新定义它,但它似乎阻止了正确导入 Base 。
我想要类似的东西:

module MyModule
export my_visible_function

function -(x,y::SomeType) 
# Base.- extension with x and ::SomeType
end

function my_visible_function()
# code using Base.- extension
end

end

有没有办法做到这一点?

感谢您的帮助。

解决方法

您可以创建自己的 - 函数,在您的模块中隐藏 Base.:-。只要在您的模块中定义 Base.:- 函数之前没有显式调用 -,这将起作用。 (更多关于下面的内容。) 然后您可以定义您的 - 函数,使其在大多数调用中回退到 Base.:-

这是一个例子:

module A
export foo

-(::Any,::Nothing) = nothing
-(x,y) = Base.:-(x,y)
foo(x,y) = x - y

end
julia> using .A

julia> foo(1,3)
-2

julia> foo(1,nothing)

julia> 1 - 3
-2

julia> 1 - nothing
ERROR: MethodError: no method matching -(::Int64,::Nothing)

以下示例表明在定义自己的 Base.:- 函数之前可以在函数定义中使用 -

# This works.

module B
export foo,bar

bar(x,y)

-(::Any,y)

foo(x,y) = x - y

end

只有在您定义自己的 - 之前显式调用 -(来自 Base)时,这才行不通。下面是一个例子:

julia> module C
       export foo
       
       1 - 3
       -(::Any,::Nothing) = nothing
       -(x,y)
       foo(x,y) = x - y
       
       end
ERROR: error in method definition: function Base.- must be explicitly imported to be extended

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...