当然,您发布的代码没有任何问题。但是,它在交互式环境中可能会表现得很奇怪,具体取决于如何收集块并将其传递给解析器。
正如所写,您声明了一个本地tempArray,然后显然使用它。如果这些行被输入到交互式 Lua 提示符中,它将每一行作为一个单独的块,那么在第一行中创建的本地将被创建并丢弃。第二行将创建一个同名的全局变量,第三行将使用全局设置一个字段。你可以这样演示:
C:\Users\Ross>lua
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio
> local tempArray
> tempArray = {}
> tempArray["Some String"] = true
>
> table.foreach(tempArray,print)
Some String true
>
> print(type(_G.tempArray))
table
>
在这里,我已经证明了表tempArray 存在并且恰好有一个值为true 的键。通过打印_G.tempArray 的类型,我已经证明创建了一个全局变量。
通过使用do ... end 对强制交互式提示将整个块视为单个块,我们既创建并使用局部变量。不幸的是,在块的end 之后,本地现在超出了范围,再也看不到了。
C:\Users\Ross>lua
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio
> do
>> local tempArray
>> tempArray = {}
>> tempArray["Some String"] = true
>> end
> print(type(_G.tempArray))
nil
> table.foreach(tempArray,print)
stdin:1: bad argument #1 to 'foreach' (table expected, got nil)
stack traceback:
[C]: in function 'foreach'
stdin:1: in main chunk
[C]: ?
>
我对《魔兽世界》的了解不够,无法以权威的身份发言,但脚本中声明的本地人可能在可见性和价值持久性方面存在有趣的问题。如果他们使用大量脚本沙盒,即使脚本中的全局变量也可能对其他脚本不可见。