Module 如何在Julia中局部扩展基运算符(在模块中)

Module 如何在Julia中局部扩展基运算符(在模块中),module,julia,overriding,base,Module,Julia,Overriding,Base,我不知道如何在本地扩展一个基操作符,我找不到任何关于它的东西 显然,我可以在全局范围(REPL或module)中重新定义它,具体操作如下: 但是我想让它在我的模块中保持私有,而不是自动导出到全局范围,以免污染它,并且仍然能够在模块中的某些功能中使用扩展。 我试着让。。。end阻塞,甚至在我的模块函数中重新定义它,但它似乎阻止正确导入Base 我想要一些像: module MyModule export my_visible_function function -(x, y::SomeType)

我不知道如何在本地扩展一个基操作符,我找不到任何关于它的东西
显然,我可以在全局范围(REPL或module)中重新定义它,具体操作如下:

但是我想让它在我的模块中保持私有,而不是自动导出到全局范围,以免污染它,并且仍然能够在模块中的某些功能中使用扩展。
我试着让。。。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.:-
,这将起作用。(更多信息请参见下文。) 然后,您可以定义
-
函数,使大多数调用都返回到
基。:-

下面是一个例子:

module A
export foo

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

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

# This works.

module B
export foo, bar

bar(x, y) = Base.:-(x, y)

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

foo(x, y) = x - y

end
如果在定义自己的
-
之前显式地调用
-
(从Base)的话,这种方法就不会起作用。下面是一个例子:

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

太好了,谢谢,更清楚了。
# This works.

module B
export foo, bar

bar(x, y) = Base.:-(x, y)

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

foo(x, y) = x - y

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