Lua элемент таблицы (Метастабильную)
В Lua таблице, мы можем получить доступ к соответствующей ключевое значение, чтобы получить значение, но она не может работать на двух таблицы.
Таким образом, Lua предоставляет элемент таблицы (метатаблица), таблица позволяет нам изменить поведение каждого действия, связанного с соответствующим элементом метода.
Например, с помощью мета-таблицу, мы можем определить, как Lua таблица для вычисления суммы двух операций а + Ь.
Когда Lua попытка добавления двух таблиц, в первую очередь проверьте, есть ли один из двух юаней таблицы, после проверки, есть ли место, называемое "__add" поле, если он найден, а затем вызвать соответствующее значение. "__add" И другой момент поле, соответствующее значение (часто функция или таблица) является "Элемент Метод."
Есть две очень важные функции для обработки юаней таблицы:
- setmetatable (таблица, метатаблица): накрыть стол для указанного элемента таблицы (метатаблица), если __metatable ключевой элемент таблицы (метатаблицы) в, setmetatable терпят неудачу.
- GetMetaTable (таблица): Возвращает таблицу метаданных объекта (метатаблицы).
В следующем примере показано, как задать таблицу для указанного элемента таблицы:
mytable = {} -- 普通表 mymetatable = {} -- 元表 setmetatable(mytable,mymetatable) -- 把 mymetatable 设为 mytable 的元表
Приведенный выше код может быть записан непосредственно на линии:
mytable = setmetatable({},{})
Ниже приведены таблицы метаданных объекта возврата:
getmetatable(mytable) -- 这回返回mymetatable
__index метод конечных элементов
Это наиболее часто используется метатаблица ключ.
Когда вы передаете ключ доступа к таблице, и если ключ не имеет значения, то Lua найти таблицу метатаблицы (предполагая, что метатаблица) в ключе __index. Если __index содержит таблицу, Lua будет найти соответствующий ключ в таблице.Мы можем использовать команду Lua, чтобы войти в интерактивный режим Просмотров:
$ lua Lua 5.3.0 Copyright (C) 1994-2015 Lua.org, PUC-Rio > other = { foo = 3 } > t = setmetatable({}, { __index = other }) > t.foo 3 > t.bar nil
Если __index содержит функцию, то, Lua будет вызывать эту функцию, таблицу и ключи будут переданы в качестве параметра функции.
__index метод конечных элементов для просмотра элемента таблицы существует, если нет, то возвращает результат равен нулю, если она существует по результатам __index возврата.
mytable = setmetatable({key1 = "value1"}, { __index = function(mytable, key) if key == "key2" then return "metatablevalue" else return nil end end }) print(mytable.key1,mytable.key2)
Примеры выход:
value1 metatablevalue
Примеры анализа:
туЬаЫе таблице присваивается{ключ1 = "значение1"}.
туЬаЫе набор мета таблицы метод конечных элементов __index.
Найти key1 в туЬаЫе таблице, если он найден, вернуть этот элемент не может быть найден, продолжайте.
Найти key2 в туЬаЫе таблице, если он найден, вернуть metatablevalue, найти продолжение.
Анализируя таблицу мета не имеет какого-либо метода __index, если __index метод является функцией, вызовите функцию.
- Метод Element, чтобы проверить, является ли входящий "ключ2" ключевой параметр (набор mytable.key2), если входящий "Клавишу2" возвращает параметр "metatablevalue", в противном случае туЬаЫе соответствующий ключ.
Мы можем написать приведенный выше код прост:
mytable = setmetatable({key1 = "value1"}, { __index = { key2 = "metatablevalue" } }) print(mytable.key1,mytable.key2)
резюме
Lua поиск правил элемент таблицы, когда, по сути, следующие три шага:
- 1. Найти в таблице, если он найден, возвращает этот элемент, не найден, продолжить
- 2. определить, имеет ли таблица юаней таблицу, если нет элемента таблицы, возвращать ноль, там продолжается таблица доллар.
- 3. Анализ мета-таблицы не имеет какого-либо метода __index, если __index метод равен нулю, возвращать ноль, если __index метод представляет собой таблицу, повторите 1,2,3, если __index метод является функцией, функция возвращает возвращать значение.
__newindex метод конечных элементов
Метод __newindex элемент используется для обновления таблицы, __ индекс используется для доступа к таблице.
Когда вы даете недостающую назначение индекса таблицы, то интерпретатор будет выглядеть __newindex метод конечных элементов: Если вы вызываете эту функцию без присвоения.
Следующий пример демонстрирует применение __newindex Element Method:
mymetatable = {} mytable = setmetatable({key1 = "value1"}, { __newindex = mymetatable }) print(mytable.key1) mytable.newkey = "新值2" print(mytable.newkey,mymetatable.newkey) mytable.key1 = "新值1" print(mytable.key1,mymetatable.key1)
Примеры реализации вышеуказанной продукции является:
value1 nil 新值2 新值1 nil
Примеры приведенных выше таблиц набор метод конечных элементов __newindex, когда новый индекс ключа (новый ключ) назначение (mytable.newkey = "Новое значение 2"), будем называть метод конечных элементов без присвоения. И если существующий индекс ключа (ключ1), будет выполнять задание, без вызова метода Элемент __newindex.
В следующем примере используется rawset функцию, чтобы обновить таблицу:
mytable = setmetatable({key1 = "value1"}, { __newindex = function(mytable, key, value) rawset(mytable, key, "\""..value.."\"") end }) mytable.key1 = "new value" mytable.key2 = 4 print(mytable.key1,mytable.key2)
Примеры реализации вышеуказанной продукции является:
new value "4"
Добавьте оператор для таблицы
Следующий пример демонстрирует две таблицы добавить операцию:
-- 计算表中最大值,table.maxn在Lua5.2以上版本中已无法使用 -- 自定义计算表中最大值函数 table_maxn function table_maxn(t) local mn = 0 for k, v in pairs(t) do if mn < k then mn = k end end return mn end -- 两表相加操作 mytable = setmetatable({ 1, 2, 3 }, { __add = function(mytable, newtable) for i = 1, table_maxn(newtable) do table.insert(mytable, table_maxn(mytable)+1,newtable[i]) end return mytable end }) secondtable = {4,5,6} mytable = mytable + secondtable for k,v in ipairs(mytable) do print(k,v) end
Примеры реализации вышеуказанной продукции является:
1 1 2 2 3 3 4 4 5 5 6 6
__add ключевой элемент, содержащийся в таблице, и добавьте операцию. Перечень действий, соответствующих следующей таблице:
режим | описание |
---|---|
__add | Соответствующий оператор '+'. |
__sub | Соответствующий оператор '-'. |
__mul | Соответствующий оператор '*'. |
__div | Соответствующий оператор '/'. |
__mod | Соответствующий оператор '%'. |
__unm | Соответствующий оператор '-'. |
__concat | Соответствующий оператор '..'. |
__eq | Соответствующий оператор '=='. |
__lt | Соответствующий оператор '<'. |
__le | Соответствующий оператор '<='. |
__call метод конечных элементов
Метод __call элемент называется когда вызывает значение. Следующий пример иллюстрирует таблицу расчета элементов, а также:
-- 计算表中最大值,table.maxn在Lua5.2以上版本中已无法使用 -- 自定义计算表中最大值函数 table_maxn function table_maxn(t) local mn = 0 for k, v in pairs(t) do if mn < k then mn = k end end return mn end -- 定义元方法__call mytable = setmetatable({10}, { __call = function(mytable, newtable) sum = 0 for i = 1, table_maxn(mytable) do sum = sum + mytable[i] end for i = 1, table_maxn(newtable) do sum = sum + newtable[i] end return sum end }) newtable = {10,20,30} print(mytable(newtable))
Примеры реализации вышеуказанной продукции является:
70
__tostring метод конечных элементов
Метод __tostring элемент используется для изменения поведения выходной таблицы. Следующие примеры нашего пользовательского вывода оглавления:
mytable = setmetatable({ 10, 20, 30 }, { __tostring = function(mytable) sum = 0 for k, v in pairs(mytable) do sum = sum + v end return "表所有元素的和为 " .. sum end }) print(mytable)
Примеры реализации вышеуказанной продукции является:
表所有元素的和为 60
Из этой статьи мы можем знать, элемент таблицы может быть хорошим упростить нашу функцию кода, поэтому понимание Lua мета таблицы позволяет писать более простой код отличный Lua.