跳到主要内容

表冻结

现在可以冻结表在其当前状态以禁止任何未来的修改。这一操作是不可逆的,对于表的寿命而言是永久的。

示例代码 1
-- 不允许对全局的表进行任何编辑
table.freeze(_G)

_G.string = {}
-- file.pluto:2: attempt to modify frozen table.
示例代码 2
-- 创建与冻结表相关联的常量
local Frozen <const> = table.freeze({ 1, 2, 3 })

Frozen = {}
-- file.pluto:4: attempt to reassign constant.

Frozen[1] = "new value"
-- file.pluto:7: attempt to modify frozen table.

rawset(Frozen, "key", "value")
-- file.pluto:10: attempt to modify frozen table.
示例代码 3
--- 尝试使用调试库交换该值。
for i = 1, 249 do
local name, value = debug.getlocal(1, i)
if name == "Frozen" then
debug.setlocal(1, i, { ["key"] = "hello world" })
-- file.pluto:5: attempt to modify local variable with a frozen table.
end
end

这将阻止什么?

这将阻止从 Lua 环境内部进行的所有对表格的修改,包括来自debug库的修改。

警告

如果您打算将此用于一个沙盒环境,请确保在用户访问 Lua 环境之前调用 table.freeze,否则他们可以替换该函数。