【问题标题】:Lua: Scope of local functionsLua:本地函数的范围
【发布时间】:2018-07-29 18:32:27
【问题描述】:

我对 Lua 中的本地函数有点困惑。请查看以下简化示例。

function test()
  local function f()
    print("f")
    g()
  end

  local function g()
    print("g")
  end

  f()
end

test()

运行此代码时,函数“f”出现错误,因为函数“g”是 nil 值。据我了解,一旦代码到达对函数“g”的调用,就应该声明这两个函数,并且由于这两个函数还没有到达它们所在的块的末尾(函数“test”),它们仍然应该是无障碍。将函数声明为全局时,此代码可以正常工作,我真的不确定为什么它不适用于本地函数。 《用 Lua 编程》这本书对我也没有帮助。

【问题讨论】:

    标签: function lua local


    【解决方案1】:

    local function g() <BODY> end 等价于 local g; g=function () <BODY> end

    f 中,名称g 被解析为全局名称,因为local g 出现在f 结束之后。这就是错误消息告诉我们的内容:

    attempt to call a nil value (global 'g')
    

    尝试在f 之前定义g

    【讨论】:

    • 以相反的方式定义函数,但我仍然不明白为什么。你能再解释一下吗?我还不明白为什么在引用后定义函数仅适用于全局函数。在我看来,它应该适用于这两种类型。
    • @Legofan431 - Lua 中局部变量(或局部函数)的可见区域从定义变量的行开始,向后传播到开头外部块(如在其他语言中)。 IMO,Lua 方法要方便得多。我现在正在尝试用 C# 编写代码并且有很多“WTF?”关于 C# 中变量的词法范围。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多