поля и переопределенное метаполе index, которое всегда возвращает что-то (в данном случае возвращает строку с оповещением, что неизвестное поле). В один момент мне надо, чтобы эта таблица вела себя как стандартная, т.е., если поле не существует, возвращала nil. Могу ли я просто сделать вот так:
self.states = setmetatable(self.states, {})
или мне нужно сделать что-то вроде:
self.states = setmetatable(self.states, getmetatable({}))
?
Давай пример поширше. Метатаблица определяет поведение прицепленных к ней таблиц. Если у метатаблицы есть поле __index, те таблицы на которые навешена метатаблица будут искать поля через это поле.
Пример такой. Имеем метатаблицу: automationModeProperty.states = setmetatable({ [0] = "trim read", [1] = "read", [2] = "touch", [3] = "write", [4] = "latch" }, { __index = function(self, key) return "Unknown automation mode "..key end }) В этом же пространстве есть функция, которая обращается к таблице и, если там значение есть, устанавливает индекс по API. if self.states[state+direction] then state = state+direction end В данный момент таблица всегда не nil, так что этот код не имеет значения.
Обсуждают сегодня