Latest web development tutorials

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, "\""..value.."\"")

  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 '..'.
__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 "表所有元素的和为 " .. 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.