2015-10-15 132 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