==== 全局变量限制 ====
如果你用Lua解释器或者[[https://www.dooccn.com/lua/|Lua在线测试]]运行如下代码:
AAA = true
print(AAA, type(AAA))
print(BBB, type(BBB))
程序可以正常运行,并输出结果:
true boolean
nil nil
但是,**在饥荒GLOBAL环境中**,对一个**未声明**的全局变量的**取值**操作是不被允许的:
启动饥荒,在控制台输入:
print(AAA, type(AAA))
会产生一个错误:
variable 'AAA' is not declared
如果你无法确认一个全局变量是否存在,应该使用如下写法:
-- 只有MakeInventoryFloatable函数存在时,才设置物品漂浮
if rawget(_G, "MakeInventoryFloatable") ~= nil then
MakeInventoryFloatable(inst, "anim", "anim")
end
另外,全局变量不能在**函数内**声明,例如:
local function fn()
AAA = "Hello Don't Starve!"
end
fn()
报错:
assign to undeclared variable 'AAA'
一般推荐先在函数外声明全局变量,因为函数内是可以修改已存在的全局变量的:
global("AAA") -- 声明 AAA 变量
-- 或者
AAA = nil -- 声明 AAA 变量并赋值为nil
local function fn()
AAA = "Hello Don't Starve!" -- 改成一个字符串
end
fn()
也可以使用global函数,在函数内声明全局变量。
local function fn()
global("AAA") -- 声明 AAA 变量
AAA = "Hello Don't Starve!" -- 赋值
end
fn()
==== 原理 ====
去看饥荒源代码 scripts/strict.lua
。
==== 总结 ====
**在饥荒GLOBAL环境中**,以下操作是不被允许的:
- 使用一个未声明的全局变量
- 在函数内声明一个全局变量
这些操作是可行的:
- 在任何位置使用/修改一个已声明的全局变量
- 在函数外面 声明一个全局变量
如何不报错:
- 要判断一个全局变量是否存在,使用 rawget(_G, "变量名")
- 要在函数内部声明全局变量,使用 global("变量名")