从Julia中的另一个模块更改全局变量的内容

时间:2016-09-27 19:43:18

标签: global-variables julia

我有两个模块,一个叫做mainLoop,另一个叫做子程序:

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中,它声明:

  

"模块可以通过using或import语句或通过使用点符号的限定访问将其他模块的变量引入其范围,即每个模块都是所谓的命名空间。请注意,变量绑定只能在其全局范围内更改,而不能在外部模块中更改。"

通过变量绑定,是否意味着您无法更改变量内容?

2 个答案:

答案 0 :(得分:5)

模块只能更改自己的全局变量,而不能更改其他模块的全局变量。当然,有一种方法可以强制模块更改自己的全局变量 - 通过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 - 尤其是其他模块的全局状态 - 是一种代码气味,如果可能应该避免使用。

答案 1 :(得分:0)

请注意,变量绑定只能在其全局范围内更改,而不能在外部模块中更改。“

模块是否由您编写?因为那样你就可以轻松地,而不是“手动”改变绑定,创建一个为你做这个功能的函数,并将该函数与其余函数一起导出,即在你的模块作为其全局范围的内容中