我有两个模块,一个叫做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语句或通过使用点符号的限定访问将其他模块的变量引入其范围,即每个模块都是所谓的命名空间。请注意,变量绑定只能在其全局范围内更改,而不能在外部模块中更改。"
通过变量绑定,是否意味着您无法更改变量内容?
答案 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)
请注意,变量绑定只能在其全局范围内更改,而不能在外部模块中更改。“
模块是否由您编写?因为那样你就可以轻松地,而不是“手动”改变绑定,创建一个为你做这个功能的函数,并将该函数与其余函数一起导出,即在你的模块作为其全局范围的内容中