Esta función sirve para proporcionar al parecer, una variante de programación orientada a objetos en Lua (un poco descuidado en mi opinión).
Esta es una fábrica para una clase.
Puede ser reescrita como sigue, para mayor claridad:
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
Ahora si creamos dos nuevas instancias de C, vemos claramente que ambos tienen un foo método(), pero diferente de auto:
o1 = newInstance(C)
o1:foo() --> foo method called table: 0x7fb3ea408ce0
o2 = newInstance(C)
o2:foo() --> foo method called table: 0x7fb3ea4072f0
los métodos foo son los mismos:
print(o1.foo, o2.foo, o1.foo == o2.foo and "equal" or "different")
--> function: 0x7fb3ea410760 function: 0x7fb3ea410760 equal
Esto es porque la tabla C (la "clase") es un __index
((A)
arriba) de metatable de o1
y o2
, establecido en (B)
. Pero o1
y o2
son en realidad dos tablas diferentes, creadas en (B)
(las "instancias de clase" u "objetos").
Nota: establecemos que C.__index
sea igual a C
en sí en (A)
por lo que reutilizaríamos una tabla. A continuación tiene el mismo efecto:
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)
Por favor, que alguien dé un mejor título a esta pregunta porque yo creo que va a ayudar a algunos desarrolladores por ahí. – chchrist