2016-08-18 33 views
4

假设我想从模块内部访问一个扩展范围的类型。要具体:Julia:我如何从模块内部访问类型?

文件Englobing.jl

using myModule 
type MyType 
    a::Float64 
    b::Vector{Float64} 
end 

t = MyType(1., [ 1., 2. ]) 

x = [ .5, .5 ] 

myFunc(x, t) 

文件myModule.jl

module myModule 

export myFunc 

    function myFunc(x::Vector{Float64}, z::MyType) 
     [ operations ] 
    end 

end 

在这种情况下,我希望能够从模块MyModule的内访问类型MyType的,而不使用global s。

回答

4

选项1:

可以导出类型了。例如。如果Englobing.jl是一个模块,你可以有:

export MyType 

然后,你myModule.jl文件中,你可以有:

using Englobing 

选项2

如果Englobing.jl不是一个模块(它目前未写成),您可以使用

include("Englobing.jl") 

MyModule.jl之内。

这两种不依赖然而,在不具有的情况下Englobing.jl使用来自MyModule.jl东西(功能,类型,对象,等),而在同一时间MyModule.jl使用来自Englobing.jl东西。如果期望的结果是有这样的情况,我不认为这是可以实现的朱莉娅,但我不明白为什么这也是可取的。

+0

谢谢 - 我通常会期望在C/C++中具有类似于'extern'的行为,即在'myModule.jl'中声明引用'MyType'类型的定义,在其他地方定义。 – Dimitris

+0

@Dimitris如何在模块中使用include()来加载定义类型的单独文件?或者,您可以在'MyModule.jl'中使用'using'来加载一个单独的模块来定义类型。这些做到了你想要做的事情吗? –

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的不同定义。但是,最好只有一个干净的模块依赖树。