Bienvenidos sean a este post, hasta ahora hemos hablado hasta el cansancio de como le gusta a Lua las tablas pero una tabla es lo que consideramos en otros lenguajes como un objeto, al igual que un objeto una tabla tambien tiene un estado y al igual que los objetos las tablas tienen una identidad (un mismo) que es independiente de sus valores.

Anuncios

Hablando mas especificamente dos objetos (tablas) con los mismos valores son diferentes objetos mientras que un objeto puede tener diferentes valores en momentos diferentes, las tablas al igual que los objetos tienen un ciclo de vida que es independiente de quien los haya creado o donde hayan sido creados, por ultimo los objetos tiene sus propios operaciones (llamados propiedades y metodos en general) y las tablas tambien poseen operaciones:

Cuenta = { balance = 0 }
function Cuenta.retirar(v)
	Cuenta.balance = Cuenta.balance - v
end

Este definicion crea una nueva funcion y la almacena en el campo retirar del objeto Cuenta para luego ser llamado de esta forma:

Anuncios
Cuenta.retirar(100.00)

Este tipo de funcion es lo que casi llamamos un metodo, sin embargo el uso del nombre global Cuenta dentro de la funcion es una mala practica de programacion porque primero esta funcion solo trabajara para este objeto en particular, y segundo incluso para este objeto la funcion trabajara solo mientras este almacenada en la variable global, si cambiamos el nombre del objeto la funcion retirar no funcionara mas:

a = Cuenta; Cuenta = nil
a.retirar(100.00)        // Devuelve ERROR!

Tal conducta infrige el principio previo de que los objetos tienen ciclos de vida independientes, un enfoque mas flexible es operar en el receptor de las operaciones, por ese nuestro metodo necesitaria un parametro extra con el valor del receptor, al que conoce un poco de programacion intuira que este parametro usualmente lo llamamos self o this:

function Cuenta.retirar(self,v)
	self.balance = self.balance - v
end
Anuncios

A partir de ahora cuando llamamos al metodo tenemos que especificar el objeto que tiene que operar:

a1 = Cuenta; Cuenta = nil
a1.retirar(100.00)        // Funciona Ok!

Con el uso de un parametro self podemos usar el mismo metodo para muchos objetos:

a2 = { balance = 0; retirar = Cuenta.retirar }
a2.retirar(260.00)
Anuncios

Este uso de un parametro self es el punto central en cualquier lenguaje orientado a objetos, la mayoria de este tipo de lenguajes tienen parcialmente escondido este mecanismo de los programadores, asi que no tiene que declarar este parametro (a pesar de que aun puede usar el nombre self o this dentro de un metodo), Lua tambien puede esconder este parametro usando el separador de objetos (:), podemos reescribir la definicion del metodo previo como sigue:

function Cuenta:retirar(v)
	self.balance = self.balance - v
end

Pero ahora a la funcion debemos llamarla de esta forma:

a1:retirar(100.00)
Anuncios

El efecto del separador es de agregar un parametro escondido en una definicion de metodo y agregar un argumento extra en una llamada de metodo, este separador es solo una facilidad sintactica y aunque es conveniente no hay nada realmente nuevo aqui porque todavia tenemos la posibilidad de poder definir una funcion con la sintaxis del punto y llamarlo con la sintaxis del separador o viceversa, siempre y cuando manejemos el parametro extra correctamente:

Cuenta = { balance = 0,
		retirar = function(self, v)
				self.balance = self.balance - v
			end
	}

function Cuenta:depositar(v)
	self.balance = self.balance + v
end

Cuenta.depositar(Cuenta, 100.00)
Cuenta:retirar(100.00)

Nuestros objetos tienen una identidad, un estado y operaciones sobre este estado, anuque todavia carecen de un sistema de clases, herencia y privacidad, de lo cual comenzaremos a hablar en el siguiente post.

Anuncios

En resumen, hoy hemos visto como es el lenguaje orientado a objetos en Lua, cuales son sus similitudes con otros lenguajes, como son las mismas conductas para Lua, y algunas formas de usarlo, espero les haya sido util sigueme en Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.00