【发布时间】:2014-03-29 06:55:49
【问题描述】:
我有一个本地 i 和一个全局 i。函数 g 选择本地而不是全局。为什么会这样?
i=30
local i=1
g = function() i=i+1; print(i)
【问题讨论】:
标签: variables lua global-variables scope
我有一个本地 i 和一个全局 i。函数 g 选择本地而不是全局。为什么会这样?
i=30
local i=1
g = function() i=i+1; print(i)
【问题讨论】:
标签: variables lua global-variables scope
当你在做的时候
i = 30
local i = 1
您正在定义一个新的全局变量i,其值为1。这个i 将被视为整个脚本中的全局变量。要访问真正的全局i,您必须提供环境(在本例中为_G):
function g()
_G.i = _G.i + 1
print( _G.i )
end
要进一步解释此处发生的情况,请考虑以下名为 a.lua 的脚本:
i = 30
local i = 1
function t()
return i
end
return _G
在这里,我真正的全局变量是i 和t。在t() 中使用的i 将是local i = 1。要查看它的实际工作情况,请创建一个新文件 b.lua,如下所示:
local a = require "a"
print( a.i, a.t() )
你会看到输出是:
30 1
【讨论】:
我认为“本地”在误导您。根据 lua 中的 Lexical Scope 概念,当定义一个局部变量时,它会影响整个块。什么是块?根据 Lua 编程:
Lua 执行的每一段代码,比如一个文件或者交互中的一行 模式,称为块
所以局部变量,这里是'i',在这个文件中起作用,无论是在函数中调用还是在其他地方调用,它的优先级都高于这个块中同名的全局变量。
【讨论】:
for,其中控制变量是块内的局部变量。局部变量的作用域是从声明后的点到声明它的块的末尾。