繁体   English   中英

Julia:我如何从模块内部访问类型?

[英]Julia: How can I access a type from inside a module?

假设我想从模块内部访问一个在englobing范围内的类型。 具体来说:

文件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。

选项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东西的Englobing.jl 如果期望的结果是有可能的情况,我不相信这在朱莉娅是可以实现的,尽管我不太明白为什么它也是可取的。

我们试图避免隐式依赖,即说“给我任何MyType定义可能就在身边”。 你必须准确地说出它的来源。

但是,两个模块可以相互使用。 module A可以包含using Bmodule 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定义。 但是,最好只有一个干净的模块依赖树。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM