2016-08-18 87 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的不同定義。但是,最好只有一個乾淨的模塊依賴樹。