Julia中的子模块内部依赖项

时间:2019-01-28 21:30:33

标签: julia dependency-management

我正在尝试创建具有以下布局的软件包:

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/..BarFoo子模块内部,子模块外部等所有组合。

# Foo.jl
module Foo

# what am I missing here?

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

end

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

这应该有效

# 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("./Foo/Foo.jl")发生时,它需要知道BarStruct存在并可访问点在当前模块(即MyPkg)中,它处于这种重新排列的布局中。

因此,只看MyPkg的前半部分

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

由时间编译器这里到达最后一行时,BarStructBarStuffCBarStuffD是带入符号MyPkg命名空间(https://docs.julialang.org/en/v1/manual/modules/#Summary-of-module-usage-1) 。

当我们达到include("./Foo/Foo.jl")线(又名复制+在这一点上粘贴该源文件到当前模块),我们需要参考BarStruct在此模块的父命名空间,即{ {1}}

答案 1 :(得分:0)

您是否尝试过使用Bar.BarStruct中的全名引用结构及其module.struct?

对于结构体和枚举,导出函数似乎不能与函数名称一起使用,但是使用Module.Struct类型的语法通常可以实现。