Lua elementem tabeli (Metatable)
W tabeli Lua, można uzyskać dostęp do odpowiedniej wartości klucza, aby uzyskać wartość, ale nie mogą być eksploatowane w dwóch tabeli.
Dlatego Lua stanowi element tabeli (Metatable), stół pozwoli nam zmienić zachowanie każdego działania związanego z odpowiednią metodą elementów.
Na przykład, przy użyciu meta tabeli można zdefiniować jak tabeli Lua obliczyć sumę dwóch operacji A + B.
Gdy Lua próba dodanie dwóch tabel, należy najpierw sprawdzić, czy istnieje jeden z dwóch tabeli juanów, po sprawdzeniu, czy istnieje miejsce zwane "__add" pole, w przypadku stwierdzenia, następnie wywołać odpowiednią wartość. "__add" I inne błyskawiczne pole, odpowiednia wartość (często funkcja lub stół) jest "Element Method".
Istnieją dwie bardzo ważne funkcje do obsługi tabeli juanów:
- setmetatable (stół, metatable): ustawić stół dla określonego elementu tablicy (metatable), jeśli istnieje __metatable kluczowy element (tabela) w metatable, setmetatable niepowodzeniem.
- getmetatable (tabela): Zwraca tablicę metadanych obiektu (metatable).
Poniższy przykład pokazuje, jak ustawić stół dla określonego elementu tabeli:
mytable = {} -- 普通表 mymetatable = {} -- 元表 setmetatable(mytable,mymetatable) -- 把 mymetatable 设为 mytable 的元表
Powyższy kod może być zapisany bezpośrednio do linii:
mytable = setmetatable({},{})
Poniżej tabela powrotu metadane obiektu:
getmetatable(mytable) -- 这回返回mymetatable
__index Element Method
Jest to najbardziej powszechnie stosowany klucz metatable.
Po przejechaniu klucza dostępu do tabel, a jeśli klucz nie ma żadnej wartości, a następnie Lua znajdzie tabelę metatable (zakładając metatable) w kluczu __index. Jeśli __index zawiera tabelę, Lua znajdzie odpowiedniego klucza w tabeli.Możemy użyć polecenia lua aby wprowadzić tryb interaktywny Wyświetleń:
$ 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
Jeśli __index zawiera funkcję, a następnie, Lua wezwie tę funkcję, stół i klucze zostaną przekazane jako parametr do funkcji.
__index metoda elementów do wyświetlenia elementu tabela istnieje, jeśli nie, wróć wynik wynosi zero, jeśli istnieje, to przez __index wyników zwrotnych.
mytable = setmetatable({key1 = "value1"}, { __index = function(mytable, key) if key == "key2" then return "metatablevalue" else return nil end end }) print(mytable.key1,mytable.key2)
Przykłady wyjście jest:
value1 metatablevalue
Przykłady analizy:
mojatabela tabeli przypisano{klucz1 = "wartość1"}.
mojatabela zestaw meta tabeli metoda elementów __index.
Znajdź klucz1 w mojatabela tabeli, w przypadku stwierdzenia, że powrót elementu nie można znaleźć, należy kontynuować.
Znajdź Klawisz2 w mojatabela tabeli, w przypadku stwierdzenia, powrót metatablevalue znajdziesz kontynuowane.
Analizując tabelę meta ma metodę __index jeśli __index metoda jest funkcją, wywołać funkcję.
- Metoda elementów do sprawdzenia, czy przychodzące "klucz2" kluczowy parametr (zestaw mytable.key2), czy przychodzące "Klawisz2" zwraca parametr "metatablevalue", w przeciwnym razie mojatabela odpowiedni klawisz.
Możemy napisać powyższy kod jest prosty:
mytable = setmetatable({key1 = "value1"}, { __index = { key2 = "metatablevalue" } }) print(mytable.key1,mytable.key2)
streszczenie
Lua odnośnika rządzi element tabeli, podczas gdy w rzeczywistości, trzy następujące kroki:
- 1. Znajdź w tabeli, w przypadku stwierdzenia, powrót tego elementu, nie znaleziono, nadal
- 2. ustalić, czy tabela zawiera tabelę RMB, jeśli nie ma elementu tabeli, powrót zerowa, nie jest kontynuowany tabeli dolara.
- 3. Analizowanie meta stół ma metodę __index jeśli __index metoda jest zerowa, powrót nil, jeśli __index metoda jest stół, powtórz 1,2,3, jeśli __index metoda jest funkcją, funkcja zwraca wartość powrotu.
__newindex Element Method
__newindex metoda elementów służy do aktualizacji tabeli, __ indeks jest używany do dostępu do tabeli.
Kiedy dajesz brakującego przypisanie tabeli indeksu, interpreter będzie wyglądać __newindex Metodę Elementów: Jeśli wywołać tę funkcję bez przydziału.
Poniższy przykład demonstruje aplikacji __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)
Przykłady realizacji powyższego przykładu jest:
value1 nil 新值2 新值1 nil
Przykłady powyższych tabelach metoda elementów __newindex, kiedy nowy klucz indeksu (newkey) cesja (mytable.newkey = "nowa wartość 2"), będzie wywołać metodę elementów bez przydziału. A jeśli istniejącego klucza indeksu (klucz1), przeprowadzi zadanie, bez wywoływania metody elementów __newindex.
W poniższym przykładzie użyto funkcji rawset zaktualizować tabelę:
mytable = setmetatable({key1 = "value1"}, { __newindex = function(mytable, key, value) rawset(mytable, key, "\""plvaluepl"\"") end }) mytable.key1 = "new value" mytable.key2 = 4 print(mytable.key1,mytable.key2)
Przykłady realizacji powyższego przykładu jest:
new value "4"
Dodaj operatorowi na stole
Poniższy przykład pokazuje dwie tabele dodać operację:
-- 计算表中最大值,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
Przykłady realizacji powyższego przykładu jest:
1 1 2 2 3 3 4 4 5 5 6 6
__add kluczowy element zawarty w tabeli i dodać operację. Lista działań odpowiadających poniższej tabeli:
tryb | opis |
---|---|
__add | Odpowiedni Operator '+'. |
__sub | Odpowiedni operator "-". |
__mul | Odpowiedni operator '*'. |
__div | Odpowiedni Operator '/'. |
__mod | Odpowiedni operator '%'. |
__unm | Odpowiedni operator "-". |
__concat | Odpowiedni Operator 'pl'. |
__eq | Odpowiedni operator '=='. |
__lt | Odpowiednie operatora '<'. |
__le | Odpowiednie operatora '<='. |
__call Element Method
__call metoda elementów jest wywoływana, gdy Lua zwraca wartość. Poniższy przykład ilustruje tabela Obliczanie elementów, przy czym:
-- 计算表中最大值,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))
Przykłady realizacji powyższego przykładu jest:
70
__toString Element Method
__toString sposób jest używany do zmiany zachowania tabeli wyjściowego. Poniższe przykłady naszej niestandardowej tabeli wyjściowej treści:
mytable = setmetatable({ 10, 20, 30 }, { __tostring = function(mytable) sum = 0 for k, v in pairs(mytable) do sum = sum + v end return "表所有元素的和为 " pl sum end }) print(mytable)
Przykłady realizacji powyższego przykładu jest:
表所有元素的和为 60
Z tego artykułu możemy wiedzieć tabeli element może być dobrym uprościć naszą funkcję kodu, więc zrozumienie Lua meta tabela pozwala nam napisać prostszą doskonałą kod Lua.