本地和地区的差异让范围规则?

时间:2015-10-15 17:47:02

标签: julia

在以下示例中:

Fs = cell(2)
i = 1
for i = 1:2
    local i # same as local i = i
    Fs[i] = () -> i
end
println(Fs[1]()) # 1
println(Fs[2]()) # 2
println(i) # 1
  1. local i是否与local i = i相同?
  2. 为什么我不能对while循环做同样的事情呢?

    Fs = cell(2)
    i = 1
    while i <= 2  #LoadError: UndefVarError: i not define
        local i = i
        Fs[i] = ()->i
        i += 1
    end
    
  3. 但必须使用let

    Fs = cell(2)
    i = 1
    while i <= 2
        let i = i
            Fs[i] = ()->i
        end
        i += 1
    end
    println(Fs[1]()) # 1
    println(Fs[2]()) # 2
    

1 个答案:

答案 0 :(得分:1)

当您引入新变量并尝试在赋值之前获取它的值时,Julia会在第一个示例中抛出UndefVarError错误:

Fs = cell(2)
i = 1
for i = 1:2
    local i # same as local i = i
    Fs[i] = () -> i
end
println(Fs[1]()) # 1
println(Fs[2]()) # 2
println(i) # 1

对于块引入了一个新的本地i,adn for command本身分配它,以便代码成功地执行它的任务。但在第二个例子中:

Fs = cell(2)
i = 1
while i <= 2  #LoadError: UndefVarError: i not define
    local i = i
    Fs[i] = ()->i
    i += 1
end

i块中引入了新的while,但在分配之前,您尝试获取它的值,这会产生错误。

在3d中,一个let命令为它的块声明了一个 new 本地块和一个新的i变量。

julia> function test3()
         Fs = cell(2)
         i = 1
         while i <= 2
             let i = 100
               println(i)
             end
             i += 1
         end
         println(i)
       end
test3 (generic function with 1 method)

julia> test3()
100
100
3# while block use the function's scope