为什么来自 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