2016-09-27 45 views
2

我有兩個模塊,一個稱爲主循環,另一個調用的子程序:改變一個全局變量的內容從另一個模塊中朱

module mainLoop 
using subroutines 
export memory 
memory = zeros(Int,10) 
foo(UInt32(17)) 
print(memory,"\n") 

end 

module subroutines 
using mainLoop 
export foo 

function foo(x::UInt32) 
    mainLoop.memory[1]=x 
end 
end 

我不能找出如何改變數組的內容稱爲子程序模塊的內存。我沒有選擇將數組作爲參數傳遞給函數,所以我必須使用全局變量。在documentation,它指出:

「模塊可以通過使用或import語句,或通過使用點符號合格訪問引入其他模塊的變量納入其範圍,即每個模塊是一個所謂的命名空間。請注意,變量綁定只能在其全局範圍內進行更改,而不能從外部模塊進行更改。「

通過變量綁定,這是否意味着您不能更改變量內容?

+0

不要使用全局變量,只是通過內存作爲參數傳遞給每個子程序。 –

回答

3

模塊只能改變自己的全局變量,而不是那些其他模塊。有一個辦法,當然,強制模塊來改變自己的全局變量 - 通過eval運行頂級代碼。

julia> module A 
      x = 1 
      y = 2 
     end 
A 

julia> module B 
      using ..A 
      println("A.x = ", A.x) # can access 
      A.y = 3 # can't set 
     end 
A.x = 1 
ERROR: cannot assign variables in other modules 

julia> A.y 
2 

julia> module C 
      using ..A 
      println("A.x = ", A.x) # can access 
      eval(A, :(y = 3)) # set y = 3, FROM module A 
      println("A.y = ", A.y) # value of y updated 
     end 
A.x = 1 
A.y = 3 
C 

julia> A.y 
3 

然而,mutating global state - 尤其是其他模塊的全局狀態 - 是一個代碼的氣味,應儘可能避免。

0

注意變量綁定只能其全球範圍內的,而不是從外部模塊改變。「

是由你寫的模塊?因爲那麼你可以很容易的,而不是改變的結合」手動」,創建一個函數,它爲你和出口,與其他功能一起,即在你的模塊看作是其全球範圍內

相關問題