是否有任何关键字像const或其他任何与lua做同样工作的关键字?

时间:2012-09-11 11:24:23

标签: lua const

lua中是否有const关键字?还是其他类似的东西?因为我想将变量定义为const并防止更改变量值。 提前谢谢。

4 个答案:

答案 0 :(得分:13)

Lua自动支持常量,但您可以添加该功能。例如,将常量放在表中,并使用metatable将表设为只读。

以下是如何操作:http://andrejs-cainikovs.blogspot.se/2009/05/lua-constants.html

复杂的是,常量的名称不仅仅是“A”和“B”,而是类似“CONSTANTS.A”和“CONSTANTS.B”。您可以决定将所有常量放在一个表中,或者将它们逻辑地分组到多个表中;例如“MATH.E”和“MATH.PI”用于数学常数等。

答案 1 :(得分:4)

如前所述,Lua中没有const

您可以使用这个小解决方法来“保护”全局定义的变量(与受保护的表相比):

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)

答案 2 :(得分:2)

Lua或类似构造中没有const个关键字。

最简单的解决方案是在评论中谨慎行事,并告知禁止写入此变量......

但是,技术上可以通过向全局环境_G(或Lua 5.2中的_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,则会引发错误。

答案 3 :(得分:2)

我知道这个问题已有七年历史了,但是 Lua 5.4 最终为开发者带来了const

local a <const> = 42
a = 100500

会产生错误:

lua: tmp.lua:2: attempt to assign to const variable 'a'

文件:0