问题描述
我不知道如何在本地扩展 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