在以下示例中:
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
local i
是否与local i = i
相同?为什么我不能对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
答案 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