Вот MWE вашей проблемы (два модуля export
с одинаковым именем):
module A
export f
f() = println("f from A")
end
module B
export f
f() = println("f from B")
end
Теперь рассмотрим ситуацию, когда вы using
оба A
и B
ипопробуйте позвонить f
:
julia> using .A, .B
julia> f()
WARNING: both B and A export "f"; uses of it in module Main must be qualified
ERROR: UndefVarError: f not defined
Причина, по которой это не удается, заключается в том, что Джулия не знает, что вы имеете в виду под f
;это A.f
или B.f
? Вы можете решить эту проблему, явно устраняя неоднозначность любого вызова f
:
julia> using .A, .B
julia> A.f()
f from A
julia> B.f()
f from B
Если вы хотите иметь возможность вызывать одну из функций только по имени (f
), то вы (пользователь) нужно выбрать, на что f
должен указывать. Вы можете сделать это, явно определив это как часть оператора импорта:
julia> using .A, .B
julia> using .B: f # explicitly choosing f to be B.f
julia> f() # no error
f from B
julia> A.f()
f from A
julia> B.f()
f from B
Другой альтернативой является просто явное определение вашего собственного имени f
в вашем пространстве имен:
julia> using .A, .B
julia> const f = B.f # defining a new name in this namespace pointing to B.f
f (generic function with 1 method)
julia> f() # no error
f from B
julia> A.f()
f from A
julia> B.f()
f from B