假设我想从模块内部访问一个englobing范围的类型。具体来说:
档案Englobing.jl
"Proxy Pattern" vs "Proxy"
file myModule.jl
using myModule
type MyType
a::Float64
b::Vector{Float64}
end
t = MyType( 1., [ 1., 2. ] )
x = [ .5, .5 ]
myFunc( x, t )
在这种情况下,我希望能够从模块myModule中访问MyType类型,而不使用module myModule
export myFunc
function myFunc( x::Vector{Float64}, z::MyType )
[ operations ]
end
end
s。
答案 0 :(得分:3)
选项1:
您也可以导出类型。例如。如果struct
是一个模块,您可以:
Englobing.jl
然后,在您的export MyType
文件中,您可以:
myModule.jl
选项2
如果using Englobing
不是一个模块(目前还没有编写),你可以使用
Englobing.jl
在include("Englobing.jl")
内。
然而,这两方面都依赖于MyModule.jl
同时使用来自Englobing.jl
的某些内容(功能,类型,对象等)MyModule.jl
的情况。使用MyModule.jl
中的内容。如果期望的结果是有可能出现这样的情况,我不相信这在朱莉娅是可以实现的,尽管我不太明白为什么它也是可取的。
答案 1 :(得分:2)
我们尽量避免隐含的依赖关系,即说"给我MyType
可能存在的任何定义"。你必须确切地说出它的来源。
但是,两个模块可以互相使用。 module A
可以包含using B
,module B
可以包含using A
。您必须在每个语句中对语句进行排序,以便在加载另一个语句时可以加载一个语句,但它可以正常工作。当然,这是不赞成的,因为两个相互依赖的模块并没有以一种有意义的方式真正分开。
另一个解决方案是将一个模块放在另一个模块中。可以从围绕模块本身代码的范围导入变量:
module Outer # or just Main, the default
type MyType
...
end
module myModule
import ..MyType # imports from the outer module
end
using .myModule
end
正如迈克尔所说,您可以将myModule
的代码放在一个单独的文件中,并include
将它放在不同的位置,以自动选择MyType
的不同定义。但是,首选只需要一个干净的模块依赖树。