2017-02-08 10 views
2

Я борюсь с переопределением переменной в цикле в 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, но, похоже, он закручивает вещи вверх, как будто я заменяю openif true, все идет гладко.

Правильно ли я понимаю, что open вводит «жесткую» область и что это причина, по которой повторное назначение задним числом делает переменную неопределенной?

ответ

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