Простой способ думать о таблицах состоит в том, что они являются словарями или ассоциативными массивами.Они также могут действовать как обычные массивы и списки.Но под капотом они хранят значения в системе пар ключ-значение.
Имея это в виду, давайте просто разбить этот абзац на каждую строку и поговорим о том, что все это значит.
1) Поскольку Lua поддерживает duck, набирая черезиспользование Metatables, способность создавать «объекты» может быть достигнута.Это по существу объектно-ориентированное программирование.
Это означает, что если объект ходит как утка и крякает как утка, можно разумно ожидать, что это утка.В Lua технически нет классов ООП, но мы можем заставить таблицы lua ходить и крякать, как классы ООП.
Когда вы создаете экземпляр класса в других языках программирования, этот экземпляр имеет все свойства, функции,и поля этого типа класса.В lua мы можем сделать так, чтобы таблицы притворялись, что делают это, связываясь с мета-методами .
local TestClass = {}
TestClass.__index = TestClass
function TestClass.new()
local tc = {
secret = "hello world"
}
setmetatable(tc, TestClass)
return tc
end
function TestClass:printSomething()
print(self.secret)
end
-- construct a new "object" of TestClass, and call one of its functions
local a = TestClass.new()
a:printSomething()
То, что здесь происходит, - TestClass перезаписывает свой метаметод __index
.Это означает, что когда таблица пытается найти ключ в своей таблице, вместо поиска индекса из собственной таблицы, она будет использовать индекс таблицы TestClass.Функция new()
создает новую таблицу, а затем перезаписывает ее метатабильную с помощью TestClass, гарантируя, что новая таблица будет вести себя так же, как и исходный объект TestClass.
Таким образом, даже если у объекта tc
нет явно определенной функции new()
или printSomething()
, вызов функций для этого объекта все еще работает.Вот как Луа может притворяться объектно-ориентированным.
2) Таблица в Lua - это объект в нескольких смыслах.Как и объекты, таблицы имеют состояние.
Это просто означает, что вы можете хранить вещи в таблицах, например, в контейнере.
local a = {
foo = 5
}
print(a.foo) -- 5
3) Как и объекты, таблицы имеютидентичность, которая не зависит от их ценностей;в частности, два объекта (таблицы) с одинаковым значением являются разными объектами ...
local a = {}
local b = {}
print(a == b) -- false
print(a == {}) -- also false
4) , тогда как объект может иметь разные значения в разное время, но это всегдатот же объект.
local a = {
foo = 5
}
print(a) -- some table pointer id
a.foo = 10
print(a) -- still the same table pointer
5) Как и у объектов, таблицы имеют жизненный цикл, который не зависит от того, кто их создал или где они были созданы.
Таблицы Lua сохраняются в памяти в зависимости от того, сколько объектов ссылаются на них .Это означает, что жизненный цикл их объекта может существовать вне их первоначальной области видимости.
local function createTable()
-- make a local table to this function
local a = {}
-- make a table to return to the program
local b = {
c = a
}
print("a = ", a) -- some table pointer
print("b = ", b) -- some other table pointer
return b
end
-- a is no longer in scope, and in other languages would be cleaned up
-- but since b holds a reference to it, it is not removed.
local d = createTable()
print("d =", d) -- should print out b's table pointer
print("d.c = ", d.c) -- should print out a's table pointer
Надеемся, это прояснит ситуацию.