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


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


17


источник


Ответы:


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

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

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


13



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

4



Здесь нет const ключевое слово в Lua или аналогичную конструкцию.

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

Однако технически возможно запретить писать (или читать) Глобальный  переменная, предоставляя метаданные для глобальной среды _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, возникает ошибка.


2