Это должно работать
# MyPkg.jl
module MyPkg
include("./Bar/Bar.jl")
using .Bar: BarStruct, BarStuffC, BarStuffD
export BarStruct, BarStuffC, BarStuffD
include("./Foo/Foo.jl")
using .Foo: FooStuffA, FooStuffB
export FooStuffA, FooStuffB
end
# Foo.jl
module Foo
using ..MyPkg: BarStruct
function print_bar_struct(bar::BarStruct)
@show bar
end
end
Объяснение: Помните, что операторы include по сути копируют + вставляют код из исходного файла в модуль в заданной строке.Таким образом, к тому времени, когда компилятор просматривает ссылки для всех символов (считывание сверху файла до конца), в точке, где происходит include("./Foo/Foo.jl")
, он должен знать, что BarStruct существует и доступен втекущий модуль (т. е. MyPkg), который находится в этом переставленном макете.
Итак, если посмотреть только на эту первую половину MyPkg
# MyPkg.jl
module MyPkg
include("./Bar/Bar.jl")
using .Bar: BarStruct, BarStuffC, BarStuffD
export BarStruct, BarStuffC, BarStuffD
к тому времени, когда компилятор достигнет последней строки, BarStruct
, BarStuffC
, BarStuffD
символы, занесенные в пространство имен MyPkg
(https://docs.julialang.org/en/v1/manual/modules/#Summary-of-module-usage-1).
Когда мы достигаем строки include("./Foo/Foo.jl")
(или копирование + вставка этого исходного файла в текущий модуль в данный момент), нам нужноссылка BarStruct
в родительском пространстве имен этого модуля, то есть ..BarStruct