Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在lua中有没有像const这样的关键字,或者其他任何与它有相同作用的关键字?_Lua_Constants - Fatal编程技术网

在lua中有没有像const这样的关键字,或者其他任何与它有相同作用的关键字?

在lua中有没有像const这样的关键字,或者其他任何与它有相同作用的关键字?,lua,constants,Lua,Constants,lua中有const关键字吗?或者其他类似的事情?因为我想将变量定义为const,并防止变量值的变化。 提前感谢。Lua不自动支持常量,但您可以添加该功能。例如,将常量放入表中,并使用metatable将表设为只读 以下是如何做到这一点: 复杂的是,常数的名称将不仅仅是“A”和“B”,而是类似于“constants.A”和“constants.B”的名称。您可以决定将所有常量放在一个表中,或者将它们逻辑地分组到多个表中;例如,数学常数的“MATH.E”和“MATH.PI”等。Lua或类似构造中没

lua中有const关键字吗?或者其他类似的事情?因为我想将变量定义为const,并防止变量值的变化。 提前感谢。

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

以下是如何做到这一点:


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

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

最简单的解决方法是在注释中写一个大大的警告,告知禁止写入此变量

但是,从技术上讲,可以通过向全局环境
\u G
(或Lua 5.2中的
\u 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
,则会抛出一个错误。

如前所述,Lua中没有
const

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

我知道这个问题已经问了七年了,但是Lua5.4 终于给开发者带来了
const

本地a=42
a=100500
将产生一个错误:

lua:tmp.lua:2:尝试分配给常量变量“a”
文件:。

另请参见。请注意,您可以将
\u ENV
和/或
\u G
设置为只读表,以模拟全局常数(以一定的性能代价)。这似乎是@finnw发布的链接中的一个非常重要的提示:“此外,这种创建只读表的方法会干扰pairs、ipair、next、#运算符和其他形式的表迭代。”此代码不正确。它可以防止设置新变量,但不会更改这些变量。需要注意的是:错误将在“编译”时产生(加载和评估代码时),不是在运行时!上面的链接是错误的,编辑队列已满,所以我无法修复它。作为参考,手动链接应该是@mhvelplund啊,链接腐烂,现代网络的瘟疫。我修复了它,谢谢你让我知道!
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)