scope of julia variables: re-assigning within a loop in open expression

回眸只為那壹抹淺笑 提交于 2020-01-15 03:16:09

问题


I am struggling with re-assigning a variable in a loop in Julia. I have a following example:

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

It fails if I do reassignment within the loop. I see that the issue with the variable scope, and because nested scopes are involved. The reference says that the loops introduce 'soft' scope. I cannot find out from the manual what scope open expression belongs to, but seemingly it screws things up, as if I replace open with if true, things run smoothly.

Do I understand correctly that open introduces 'hard' scope and that it is the reason why re-assignment retroactively makes the variable undefined?


回答1:


You should think of

open("file") do f
    ...
end

as

open(function (f)
    ...
end, "file")

that is, do introduces the same kind of hard scope as a function or -> would.

So to be able to write to feature from the function, you need to do

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

Note that this is only the case in top-level (module) scope; once inside a function, there are no hard scopes.

(The for loop in this case is a red herring; regardless of the soft scope of the loop, the access to feature will be limited by the hard scope of the anonymous function introduced by do.)



来源:https://stackoverflow.com/questions/42125687/scope-of-julia-variables-re-assigning-within-a-loop-in-open-expression

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!