2016-06-06 4 views
2

Я использовал Python, но теперь я изучаю Lua из-за факела. Слово «metatable» действительно трудно понять для меня. Например, можно ли метализовать специальный вид таблицы? Как это изменит поведение таблицы?Как понять metatable в Lua?

+2

См. Https://www.lua.org/pil/13.html. – lhf

+1

Особенно рекомендуется [§13.4] (https://www.lua.org/pil/13.4.html), поскольку в объектно-ориентированном Lua используется '__index'. –

ответ

8

Metatable - это просто таблица, которая используется для управления поведением другой таблицы (или пользовательских данных). Таблица является метатемой только потому, что она равна как метатет. То есть «метатебель» не является фундаментальным свойством таблицы. Нет никакой функции create_metatable или чего-либо еще. Это просто имя, которое мы используем для таблицы, которая используется для управления другими таблицами.

Определенные операции над таблицами (или пользовательскими данными) указаны для проверки метатегирования таблицы в первую очередь. Если таблица (или userdata) имеет метатебель, и что metatable имеет определенную пару ключ/значение в ней, тогда операция будет использовать эту пару ключ/значение для выполнения этой операции вместо обычной логики.

Каждая операция, которая может быть переопределена метатемой, имеет определенное ключевое имя, связанное с ней. Поэтому, если вы попытаетесь выполнить добавление в таблицу, система будет искать ключ __add в метатете, чтобы получить к нему доступ.

Значение в паре обычно (хотя и не всегда) является функцией. Такие функции обычно называются «метафунками». Параметры, которые он принимает, и значение его возвращаемого значения определяется конкретной операцией, вызывающей его. Несколько операций позволяют использовать значение как таблицу или что-то еще.

В Lua вы назначаете метатет к таблице (но не пользовательским данным) с помощью функции setmetatable. С C вы используете функцию lua_setmetatable, чтобы присвоить таблицу (или userdata) метатебель.

Метатеги особенно важны для кода C, который предоставляет объекты C в качестве пользовательских данных. Необработанная пользовательская информация - это просто непрозрачный блок бит; Lua определяет очень мало юридических операций, которые могут быть выполнены по умолчанию. Но, назначив их метатебельными, вы можете дать пользовательским данным больше возможностей с помощью метафайлов.

Смежные вопросы