2015-10-15 119 views
0

在下面的例子:本地和区分范围规则的区别?

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 
    

但必须使用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

当你引入新的变量,并设法得到它的分配前值,朱莉娅抛出一个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命令它自己分配它,以便代码成功地完成它的任务。但在第二个例子:

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

iwhile块被引入,但你尝试分配之前得到它的价值,这会产生一个错误。

在3d一个let命令声明一个本地块和一个新的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