【问题标题】:Difference in local & let scoping rule?本地差异&让范围规则?
【发布时间】:2016-01-14 07:17:06
【问题描述】:

在以下示例中:

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 ilocal 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

【问题讨论】:

    标签: julia


    【解决方案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
    

    For 块引入了一个新的本地 i,并为命令本身分配了它,因此代码成功地完成了它的职责。但在第二个例子中:

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

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

    在 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  
    

    【讨论】:

      猜你喜欢
      • 2014-03-09
      • 1970-01-01
      • 1970-01-01
      • 2015-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      相关资源
      最近更新 更多