Latest web development tutorials

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.