用户工具

站点工具


侧边栏

06mod教程区:高级技巧:strict

全局变量限制

如果你用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()

原理

去看饥荒源代码 <code>scripts/strict.lua</code>

总结

在饥荒GLOBAL环境中,以下操作是不被允许的:

  • 使用一个未声明的全局变量
  • 在函数内声明一个全局变量

这些操作是可行的:

  • 在任何位置使用/修改一个已声明的全局变量
  • 在函数外面 声明一个全局变量

如何不报错:

  • 要判断一个全局变量是否存在,使用 rawget(_G, “变量名”)
  • 要在函数内部声明全局变量,使用 global(“变量名”)
06mod教程区/高级技巧/strict.txt · 最后更改: 2021/11/04 20:33 (外部编辑)