2013-06-26 8 views
5

Zacząłem uczyć się programowania prototypowego w Lua. Zastanawiam się, jakie jest użycie metatabeli bez metametodów. W przykładzie poniżej jest linia self .__ index = self kiedy usuwam tę linię somevalue nie jest widoczny w moim nowym obiekcie jest to normalne, ponieważ nie użyłem metamethod __index. Jakie jest zatem użycie metatabeli - aby użyć tylko metametodów? Przepraszam za trywialne pytanie, ale to jest naprawdę ciekawe, wiem, że mogę użyć getmetatable do sprawdzenia metatable jakiegoś obiektu. Potrzebuję prostej odpowiedzi: nie ma użycia bez metametodów lub istnieje (jeśli tak, to co).Co używa metatabeli bez metametodów?

-- Example taken from the official documentation. 
Account = { somevalue = 1 } 

function Account:new (o) 
    o = o or {} -- create object if user does not provide one 
    setmetatable(o, self) 
    --self.__index = self 
    return o 
end 

a = Account:new() 
print(a.somevalue) -- nil, so I can't use any features of the metatable till I use some metamethod? 

Odpowiedz

4

Z definicji metatables przechowuje metametody. Nie oznacza to, że metatable musi przechowywać tylko metamorfody ; kilka bibliotek używa się jako metatabeli.

Metatable to zwykły stolik Lua. Staje się ono tylko metatablem obiektu, gdy wywołujemy z nim drugi argument jako setmetatable.

1

No tak, metatables przechowywania metamethods obiektu, i to właśnie oni są przyzwyczajeni do, przynajmniej ja nie widziałem żadnego innego USECASE.

3

Można także klucze lub wartości lub obu słaby z metatable klucza __mode, która przyjmuje wartość ciągu, a nie funkcji (metoda)

Większość metamethods są wyjaśnione tutaj:

Niektóre funkcje API Lua również przetestować dla konkretnych metod meta, jak

  • __pairs - dla par()
  • __ipairs - dla Ipairs()
  • __tostring - zwane przez toString funkcji
  • __gc() - do zbierania śmieci
  • __metatable - odczytane przez ustawienia/funkcji getmetatable (również wartość)

Jeśli przeszukasz plik manual pod konkretną nazwą, w tym __, znajdziesz t ma pełną definicję i wyjaśnienie, nie ma sensu powtarzać go tutaj.