为什么来自 Julia 子模块的函数被隐藏了?
Why is a function from a Julia submodule being shadowed?
考虑以下代码:
module Foo
export g, h
module Bar
export f
f(::Int) = 2
end
using .Bar
f(::String) = "abc"
g() = f("a")
h() = f(12)
end
当我 运行 这样做时,如果我尝试调用 g()
,我会按预期得到 "abc"
。如果我调用 h()
,我会收到一条错误消息。不知何故, f(::Int)
的定义被隐藏了。那应该发生吗?如何解决这个问题?
如果我省略 f(::String)
的定义,那么 h()
有效。
是的,这是正确的行为。为了扩展方法,应该导入 (https://docs.julialang.org/en/v1/manual/modules/#using-and-import-with-specific-identifiers,-and-adding-methods)
所以,正确的例子应该是这样的:
module Foo
export g, h
module Bar
export f
f(::Int) = 2
end
using .Bar
import .Bar: f
f(::String) = "abc"
g() = f("a")
h() = f(12)
end
我添加了 import .Bar: f
,因为 Bar
可以导出您不想扩展的其他名称。所以把这两个混在一起就好了。有了这个添加,一切都按预期工作
julia> using .Foo
julia> g()
"abc"
julia> h()
2
考虑以下代码:
module Foo
export g, h
module Bar
export f
f(::Int) = 2
end
using .Bar
f(::String) = "abc"
g() = f("a")
h() = f(12)
end
当我 运行 这样做时,如果我尝试调用 g()
,我会按预期得到 "abc"
。如果我调用 h()
,我会收到一条错误消息。不知何故, f(::Int)
的定义被隐藏了。那应该发生吗?如何解决这个问题?
如果我省略 f(::String)
的定义,那么 h()
有效。
是的,这是正确的行为。为了扩展方法,应该导入 (https://docs.julialang.org/en/v1/manual/modules/#using-and-import-with-specific-identifiers,-and-adding-methods)
所以,正确的例子应该是这样的:
module Foo
export g, h
module Bar
export f
f(::Int) = 2
end
using .Bar
import .Bar: f
f(::String) = "abc"
g() = f("a")
h() = f(12)
end
我添加了 import .Bar: f
,因为 Bar
可以导出您不想扩展的其他名称。所以把这两个混在一起就好了。有了这个添加,一切都按预期工作
julia> using .Foo
julia> g()
"abc"
julia> h()
2