Как работают метатаблицы и для чего они используются? - PullRequest
2 голосов
/ 23 ноября 2010

У меня есть один вопрос о метатаблях Луа.Я слышал и искал их, но я не понимаю, как их использовать и для чего.

Ответы [ 4 ]

9 голосов
/ 23 ноября 2010

метатаблицы - это функции, которые вызываются при определенных условиях. Возьмите метатабельный индекс «__newindex» (два подчеркивания), когда вы назначаете ему функцию, эта функция будет вызываться, когда вы добавляете новый индекс в таблицу, например;

table['wut'] = 'lol';

это пример настраиваемой метатаблицы с использованием '__newindex'.

ATable = {}
setmetatable(ATable, {__newindex = function(t,k,v)
    print("Attention! Index \"" .. k .. "\" now contains the value \'" .. v .. "\' in " .. tostring(t));
end});

ATable["Hey"]="Dog";

вывод:

Внимание! Индекс «Эй» теперь содержит значение «Собака» в таблице: 0022B000

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

Это список всех возможных метатабельных индексов, которые вы можете использовать

* __index(object, key) -- Index access "table[key]".
* __newindex(object, key, value) -- Index assignment "table[key] = value".
* __call(object, arg) -- called when Lua calls the object. arg is the argument passed.
* __len(object) -- The # length of operator.
* __concat(object1, object2) -- The .. concatination operator.
* __eq(object1, object2) -- The == equal to operator.
* __lt(object1, object2) -- The < less than operator.
* __le(object1, object2) -- The <= less than or equal to operator.
* __unm(object) -- The unary - operator.
* __add(object1, object2) -- The + addition operator.
* __sub(object1, object2) -- The - subtraction operator. Acts similar to __add.
* __mul(object1, object2) -- The * mulitplication operator. Acts similar to __add.
* __div(object1, object2) -- The / division operator. Acts similar to __add.
* __mod(object1, object2) -- The % modulus operator. Acts similar to __add.
* __tostring(object) -- Not a proper metamethod. Will return whatever you want it to return.
* __metatable -- if present, locks the metatable so getmetatable will return this instead of the metatable and setmetatable will error. 

Надеюсь, это прояснит ситуацию, если вам понадобится еще несколько примеров, нажмите здесь .

3 голосов
/ 23 ноября 2010
0 голосов
/ 26 ноября 2010

Для высокого уровня, интересного прочтения по шаблону прототипа, посмотрите http://steve -yegge.blogspot.com / 2008/10 / universal-design-pattern.html . Это может помочь вам с «что».

0 голосов
/ 25 ноября 2010

Они позволяют обрабатывать таблицы как другие типы, такие как строки, функции, числа и т. Д.

...