Есть ли какое-либо ключевое слово, такое как const или что-нибудь еще, что делает с ним ту же работу в lua?

Есть ли ключевое слово const в lua? Или любая другая подобная вещь? Потому что я хочу определить мои переменные как const и предотвратить изменение значения переменных. Спасибо заранее.

Ответы

Ответ 1

Lua не поддерживает константы автоматически, но вы можете добавить эту функциональность. Например, поместив константы в таблицу и сделав таблицу доступной только для чтения, используя метатебель.

Вот как это сделать: http://andrejs-cainikovs.blogspot.se/2009/05/lua-constants.html

Усложнение состоит в том, что имена ваших констант будут не просто "A" и "B", а что-то вроде "CONSTANTS.A" и "CONSTANTS.B". Вы можете поместить все свои константы в одну таблицу или логически объединить их в несколько таблиц; например "MATH.E" и "MATH.PI" для математических констант и т.д.

Ответ 2

Как уже отмечалось, в 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)

Ответ 3

В Lua или аналогичной конструкции нет ключевого слова const.

Самое простое решение - написать большую осторожность в комментарии, указав, что запрещается писать эту переменную...

Однако технически невозможно запретить запись (или чтение) в глобальную переменную, предоставляя метатебель для глобальной среды _G (или _ENV в Lua 5.2).

Что-то вроде этого:

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, выдается ошибка.

Ответ 4

Я знаю, что этому вопросу семь лет, но Lua 5.4 наконец-то приносит разработчикам TG40!

local a <const> = 42
a = 100500

Выдаст ошибку:

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

Docs: https://www.lua.org/work/doc/manual.html#3.3.7