lua 中有 const 关键字吗?或者其他类似的东西?因为我想将我的变量定义为 const 并防止变量值的变化。提前致谢。
问问题
23598 次
4 回答
23
我知道这个问题已经七年了,但是Lua 5.4
终于给const
开发者带来了!
local a <const> = 42
a = 100500
会产生错误:
lua: tmp.lua:2: attempt to assign to const variable 'a'
文档:https ://www.lua.org/manual/5.4/manual.html#3.3.7 。
于 2019-10-03T18:28:26.923 回答
19
Lua 不自动支持常量,但您可以添加该功能。例如,将常量放入表中,并使用 metatable 将表设为只读。
这是如何做到的: http: //andrejs-cainikovs.blogspot.se/2009/05/lua-constants.html
复杂之处在于您的常量名称将不仅仅是“A”和“B”,而是类似于“CONSTANTS.A”和“CONSTANTS.B”的名称。您可以决定将所有常量放在一个表中,或者将它们逻辑分组到多个表中;例如数学常数的“MATH.E”和“MATH.PI”等。
于 2012-09-11T11:44:14.263 回答
5
如前所述const
,Lua 中没有。
您可以使用这个小解决方法来“保护”全局定义的变量(与受保护的表相比):
local protected = {}
function protect(key, value)
if _G[key] then
protected[key] = _G[key]
_G[key] = nil
else
protected[key] = value
end
end
local meta = {
__index = protected,
__newindex = function(tbl, key, value)
if protected[key] then
error("attempting to overwrite constant " .. tostring(key) .. " to " .. tostring(value), 2)
end
rawset(tbl, key, value)
end
}
setmetatable(_G, meta)
-- sample usage
GLOBAL_A = 10
protect("GLOBAL_A")
GLOBAL_A = 5
print(GLOBAL_A)
于 2012-09-11T12:35:45.230 回答
2
Lua 或类似结构中没有const
关键字。
最简单的解决方案是在评论中写一个很大的警告,告诉禁止写入这个变量......
然而,技术上可以通过向全局环境(或在 Lua 5.2 中)提供元表来禁止对全局变量的写入(或读取)。_G
_ENV
像这样的东西:
local readonly_vars = { foo=1, bar=1, baz=1 }
setmetatable(_G, {__newindex=function(t, k, v)
assert(not readonly_vars[k], 'read only variable!')
rawset(t, k, v)
end})
然后,如果您尝试将某些内容分配给foo
,则会引发错误。
于 2012-09-11T11:47:18.820 回答