Сегодня пытался придумать адекватную прокси-табличку, которая бы была оберткой над модулем, чтобы при отсутствии модуля не падать с attempt to index a nil value, но в итоге взгрустнул, что все варианты адекватно предусмотреть не получится (или я глупый).
Ну чот типа такого.
Исходный модуль CoolModule. Вызов какой-нибудь функции CoolModule.MyFunc(). Получение какой-нибудь константы CoolModule.CONST. И вот в некоторых случаях этого модуля может не быть. И хочется избавиться от проверок а-ля if CoolModule then … end
А это смотря что ты делаешь со значениями ключей, которые не можешь найти.
Ну класека —
local MyTable = {}
local mt = {}
function mt:__index(key)
return rawget(self, key) or "Nothing here"
end
setmetatable(mt, MyTable)
Другое дело что возвращаемое "дефолтное значение" может быть только одного типа. Но можно извратиться:
local MyTable = {}
local emptyProxy = {}
local mt = {}
setmetatable(emptyProxy, mt)
function mt:__tostring()
return "nothing here"
end
function mt:__concat(v)
return tostring(self) .. tostring(v)
end
function mt:__call()
return "empty func"
end
-- рекурсия, о да
function mt.__index(...)
return rawget(...) or emptyProxy
end
function mt:__add(v)
return self == emptyProxy and v or self
end
mt.__sub = mt.__add
mt.__mul = mt.__add
mt.__div = mt.__add
setmetatable(MyTable, {__index = mt.__index})
Эту "дефолтную таблицу" можно вызывать как функцию, складывать, вычитать, конкатенировать и она работает типа как "дефолтное пустое значение с которым делайте что хотите, ничо не будет"