【问题标题】:This local function can be accessed outside the scope, any explanation?这个本地函数可以在范围外访问,有什么解释吗?
【发布时间】:2020-12-07 11:40:27
【问题描述】:
for i = 1, 20 do  --Create a loop
  if i < 10 then 
    local function LessThan10() 
      return i
    end 
  end
end 
print(LessThan10())

令人惊讶的是,尽管LessThan10 在条件语句中并且它是一个local 函数(实际上它不是函数,而是变量)。不知何故,我仍然可以打印出答案

这很有趣(我在 Zerobrane 中检查过,LessThan10 是一个本地函数)

编辑:嗯,我想这是我的解释器问题,我改变了解释器,这件事出错了。

【问题讨论】:

  • Nvm,我的 lua 版本过时了,对不起各位 B(
  • 这从未奏效。也许您之前将 LessThan10 定义为全局变量。
  • 如果它不起作用,我不会发布这个问题。另外,这是基于 Lua 5.1 书中的示例(我没有复制粘贴)
  • 这不是 5.0 或 5.1 中的合法代码。 Variables are visible until the end of the innermost block in which they are declared。在 5.0 和 5.4 中都是如此。其他事情正在发生。上面链接的可见性部分中的“基于示例”吗?显示了一个用函数闭包填充表的循环示例,但这不是发布的代码所做的。如果不是,这个示例代码是什么?

标签: function lua scope


【解决方案1】:

在 Lua 5.0 解释器中测试:

Lua 5.0.3  Copyright (C) 1994-2006 Tecgraf, PUC-Rio
> for i = 1, 20 do  --Create a loop
>>   if i < 10 then
>>     local function LessThan10()
>>       return i
>>     end
>>   end
>> end
> print(LessThan10())
stdin:1: attempt to call global `LessThan10' (a nil value)
stack traceback:
        stdin:1: in main chunk
        [C]: ?

我也不敢相信这是/是有效代码,因为局部变量仅在它们声明的块中可见。

如果您使用的是自定义 Lua 解释器,您应该进一步研究它,不过看起来很有趣。

【讨论】:

    【解决方案2】:

    我对此进行了测试,它仅适用于 Lua 5.0 和 5.1

    我在Lua 5.3 上再次对其进行了测试,但它不再有效

    我的 zerobrane 无缘无故地将我的 lua 版本重置为 5.0,好吧,如果这个问题让你失望了,很抱歉。

    【讨论】:

      猜你喜欢
      • 2022-10-06
      • 2018-09-21
      • 2012-10-26
      • 2020-05-02
      • 2016-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      • 2020-02-23
      相关资源
      最近更新 更多