在下面的代码中,我尝试从函数test()
中修改所有全局变量(s
,t
,u
,v
)。由于u
和v
位于模块内,因此Mod.u
和Mod.v
是只读变量,所以我试图通过setter函数(set_u
和set_v
)更改它们的值。全局变量值的更改没有立即更新?
s = 1
const t = 2
module Mod
u = 3
const v = 4
set_u(u_) = (global u ; u = u_)
set_v(v_) = (global v ; v = v_)
end
function test()
global s, t
s = "S" ; t = 200
@show s, t
Mod.set_u("U") ; Mod.set_v(400)
@show Mod.u, Mod.v
end
test()
@show s, t
@show Mod.u, Mod.v
结果(与朱V0.4.0获得)是
WARNING: redefining constant t
(s,t) = ("S",2) # (1)
WARNING: redefining constant v
(Mod.u,Mod.v) = ("U",4) # (2)
(s,t) = ("S",200) # (3)
(Mod.u,Mod.v) = ("U",400) # (4)
在这里,(3)和(4)是我的预期结果(假设const
修正仅变量的类型)。但我不明白为什么在(1)和(2)不被更新的t
和Mod.v
值。我是否在改变全局变量的价值方面犯了很大的错误或误解......?或者这是因为从函数内部或外部引用全局变量的某种不同机制?
嗯,好吧,现在我明白了...我总是假设'const'修复仅变量类型(因为它允许更改值),但是这似乎是因为汇编代码利用了假设常量性是危险的。 ..我试图在模拟中使用Julia模块中的const全局变量作为“可修改的参数”(遵循Fortran模块中流行的方式),但这似乎不是一个好主意。非常感谢:) – roygvib
刚刚使用'const t = [3]'进行测试,作为LLVM优化的实用解决方案。类型信息得到保存:'typeof(t [1])== Int64',内容可以改变。再次,这是一个解决方法,但它的工作原理。 –
@ user3580870嗨,我刚刚也证实你的方法有效。此外,似乎可以对const,全局复合类型使用相同的技巧(即Any在其字段仍然可变时不传播)。所以这样的const全局类型可能对我的目的有用...但我也会尝试考虑更多的“朱利安”来存储参数,而不是简单地从其他语言翻译。谢谢 :) – roygvib