我正在努力在Julia的循环中重新分配变量。我有一个例子:
infile = "test.txt"
feature = "----"
for ln in 1:3
println(feature)
feature = "+"
end
open(infile) do f
#if true
# println(feature)
# feature = "----"
println(feature)
for ln in 1:5 #eachline(f)
println("feature")
#fails here
println(feature)
# because of this line:
feature = "+"
end
end
如果我在循环中重新分配,它会失败。我看到变量范围的问题,并且因为涉及嵌套的范围。 reference表示循环引入了“软”范围。我无法从手册中找到open
表达式所属的范围,但看起来它会搞砸,就像我用open
替换if true
一样,事情顺利进行。
我是否正确理解open
引入了“硬”范围,并且这是为什么追溯重新分配会使变量未定义?
答案 0 :(得分:3)
你应该想到
open("file") do f
...
end
作为
open(function (f)
...
end, "file")
也就是说,do
引入了与function
或->
相同的硬性范围。
因此,为了能够从函数写入feature
,您需要执行
open(infile) do f
global feature # this means: use the global `feature`
println(feature)
for ln in 1:5
println("feature")
println(feature)
feature = "+"
end
end
请注意,这只是顶级(模块)范围的情况;一旦进入函数,就没有硬范围。
(在这种情况下,for
循环是一个红色鲱鱼;无论循环的软范围如何,feature
的访问权限都将受do
引入的匿名函数的硬范围限制。 {1}}。)