julia变量的范围:在open表达式中的循环内重新赋值

时间:2017-02-08 23:40:50

标签: scope julia

我正在努力在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引入了“硬”范围,并且这是为什么追溯重新分配会使变量未定义?

1 个答案:

答案 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}}。)