Me gusta pensar en OOP como la encapsulación de datos dentro de un contenedor (el objeto) junto con un subconjunto de operaciones que se pueden realizar con estos datos. HAY mucho más, pero supongamos que esta simple definición es todo y construya algo en Lua a partir de ella (también cierta familiaridad con otras implementaciones de OO puede ser un buen impulso para el lector).
Como cualquier persona con un poco de exposición a Lua puede saber, tablas son una forma elegante para almacenar pares clave-valor y en combinación con cadenas, las cosas empiezan a ser muy interesante:
valores de cadena
local obj = {} -- a new table
obj["name"] = "John"
obj["age"] = 20
-- but there's a shortcut!
print("A person: " .. obj.name .. " of the age " .. obj.age)
como se puede acceder a las claves de una tabla de forma muy parecida a los miembros de una estructura en C o a los miembros públicos de un objeto en C++/Java e idiomas similares.
Y ahora para un fantástico truco de magia: combinemos esto con funciones anónimas.
-- assume the obj from last example
obj.hello = function()
print("Hello!")
end
obj.goodbye = function()
print("I must be going.")
end
obj.hello()
obj.goodbye()
Awesome right? Ahora tenemos medios para tener funciones almacenadas dentro de nuestras tablas, y de nuevo se puede ver que se asemeja a cómo se usan los métodos en otros lenguajes de OOP. Pero algo falta. ¿Cómo podemos acceder a los datos que pertenecen a nuestro objeto dentro de nuestras definiciones de métodos? Esto se trata en general por el cambio de la firma de las funciones en la tabla a algo como esto:
-- assume the obj from last example
obj.inspect = function (self)
print("A person: " .. self.name .. " of the age " .. self.age)
end
obj.hello = function (self)
print(self.name .. ": Hello! I'm " .. self.name)
end
obj.goodbye = function (self)
print(self.name .. ": I must be going.")
end
-- now it receives the calling object as the first parameter
obj.inspect(obj) -- A person: John of age 20
obj.hello(obj) -- John: Hello! I'm John
obj.goodbye(obj) -- John: I must be going
Eso lo resuelve de una manera sencilla. Tal vez dibujar un paralelo con la forma en que funcionan las cosas en Python (los métodos siempre tienen un yo explícito) puede ayudarte a aprender cómo funciona esto en Lua. Pero chico, ¿no es inconveniente pasar todos estos objetos explícitamente en nuestras llamadas a métodos? Sí me molesta demasiado, así que no hay otro acceso directo para ayudarle en el uso de la programación orientada a objetos:
obj:hello() -- is the same as obj.hello(obj)
Por último, sólo hemos arañado la superficie de cómo se puede hacer esto. Como se ha observado en Kevin Vermeer's comment, el Lua Users Wiki es una excelente fuente de información sobre este tema y allí puede aprender todo sobre cómo implementar otros aspectos importantes de OOP que se han descuidado en esta respuesta (miembros privados, cómo construir objetos, herencia , ...). Tenga en cuenta que esta forma de hacer las cosas es una pequeña parte de la filosofía de Lua, que le proporciona herramientas ortogonales simples capaces de construir construcciones más avanzadas.
voy a añadir recompensa a ella, una vez que encontrar la manera, la respuesta tan superior en, por ejemplo nos dejó 'acerca a la semana' lo consigue:) –
¿Quieres decir como C++? Bueno, mejor no entrar en ese debate :( –
El PIL de Lua tiene referencias detalladas para él http://www.lua.org/pil/16.html –