Funkcja ta najwyraźniej służy do zapewnienia wariant OOP w Lua (trochę zaniedbany moim zdaniem).
To jest fabryka dla klasy.
może być przepisana następująco, dla jasności:
C = { }
C.foo = function(self) -- just some method, so class would not be empty
print("foo method called", tostring(self))
end
C.__index = C -- (A)
function newInstance(class)
return setmetatable({ }, class) -- (B)
end
Teraz jeśli tworzymy dwie nowe instancje C, widzimy wyraźnie, że obie mają foo() metoda, ale różni się samo:
o1 = newInstance(C)
o1:foo() --> foo method called table: 0x7fb3ea408ce0
o2 = newInstance(C)
o2:foo() --> foo method called table: 0x7fb3ea4072f0
metody foo są takie same:
print(o1.foo, o2.foo, o1.foo == o2.foo and "equal" or "different")
--> function: 0x7fb3ea410760 function: 0x7fb3ea410760 equal
to dlatego tabela C ("klasy") jest __index
((A)
powyżej) z metatable o1
i o2
, zestaw w (B)
. Ale o1
i o2
są w rzeczywistości dwiema różnymi tabelami utworzonymi pod numerem (B)
("wystąpienia klas" lub "obiekty").
Uwaga: ustawiliśmy C.__index
na równe C
na (A)
, abyśmy mogli ponownie wykorzystać jedną tabelę. Następujący ma taki sam efekt:
prototype = { }
prototype.foo = function(self) -- just some method, so class would not be empty
print("foo method called", tostring(self))
end
C = { __index = prototype }
function newInstance(class)
return setmetatable({ }, class)
end
o = newInstance(C)
Proszę ktoś dać lepszy tytuł na to pytanie bo ja myślę, że to pomoże niektórych deweloperów tam. – chchrist