scope of julia variables: re-assigning within a lo

2019-07-24 13:57发布

问题:

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.)



标签: scope julia