Подмодуль внутризависимости в Юлии - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь создать пакет со следующим макетом:

MyPkg
├── MyPkg.jl
├── Foo
│   ├── Foo.jl
│   └── another_file.jl
└── Bar
    ├── Bar.jl
    └── yet_another_file.jl

Мой основной модуль пакета выглядит примерно так:

# MyPkg.jl
module Pkg

include("./Foo/Foo.jl")
using .Foo: FooStuffA, FooStuffB
export FooStuffA, FooStuffB

include("./Bar/Bar.jl")
using .Bar: BarStruct, BarStuffC, BarStuffD
export BarStruct, BarStuffC, BarStuffD

end

Проблема возникает, когда Fooнужен тип (в частности, struct), определенный в Bar в некоторых аргументах функции.Я не уверен, как импортировать этот тип.Я, кажется, попробовал все комбинации include("../Bar/Bar.jl"), using Bar/.Bar/..Bar, внутри подмодуля Foo, вне подмодуля и т. Д.

# Foo.jl
module Foo

# what am I missing here?

function print_bar_struct(bar::BarStruct)
    @show bar
end

end

Любой совет?

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Это должно работать

# 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

0 голосов
/ 29 января 2019

Вы пытались ссылаться на структуру с ее полным именем module.struct, как в Bar.BarStruct?

Со структурами и перечислениями функция экспорта, похоже, работает не так хорошо, как с именами функций, но часто работает синтаксис типа Module.Struct.

...