==== 全局变量限制 ==== 如果你用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("变量名")