2016-09-27 44 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

注意变量绑定只能其全球范围内的,而不是从外部模块改变。“

是由你写的模块?因为那么你可以很容易的,而不是改变的结合”手动”,创建一个函数,它为你和出口,与其他功能一起,即在你的模块看作是其全球范围内

相关问题