Hagamos ahora un pequeño resumen:
Los objetos son instancias de una clase, cuando se utilizar la expresión clase.new entonces es cuando se instancia el objeto y automáticamente se llama al constructor, todo lo definido dentro del constructor se ejecuta.
Los constructores sirven principalmente para darle valores iniciales a las variables de instancias.
Volviendo a nuestro ejemplo, si queremos rescatar el tamaño tenemos un problema, no se puede acceder directamente a los estados internos de un objeto debido al principio de encapsulamiento, para acceder a los estados tenemos que crear getters y setters, o sea métodos para obtener los estados (getters) y métodos para cambiarlos (setters), así que nuestro MoldeLego quedaría así:
class MoldeLego def initialize() @size = 1 # las variables de instancia se definen con una @ end def getSize() return @size end def setSize(new_size) @size = new_size end end
Para usarlo, lo haríamos de la siguiente forma:
lego1 = MoldeLego.new # Este Lego ahora tiene tamaño 1 lego1.setSize(5) lego1.getSize()
Exista una mejor forma de definir los getters y setters, que es hacerlo de tal manera que pareciera que estamos trabajando directamente sobre el atributo.
class MoldeLego def initialize() @size = 1 # las variables de instancia se definen con una @ end def size() return @size end def size=(new_size) @size = new_size end end
de esta forma podemos ocupar el objeto así:
lego1 = MoldeLego.new # Este Lego ahora tiene tamaño 1 lego1.size # devuelve 1, pues es el tamaño original lego1.size = 5 lego1.size # devuelve 5, ya que lo cambiamos
ahora en ruby es posible definir de forma simultánea la variable, los getters y setters a través del attr_accessor:
class MoldeLego attr_accessor :size
def initialize() @size = 1 # las variables de instancia se definen con una @ end end
y para ocuparlo sería exactamente que la forma anterior, ahora volvamos a la idea de acoplar:
class MoldeLego attr_accessor:size
# Pasamos un valor al constructor # para poder crear legos de otros tamaños # en caso de que se omita es de tamaño 1 def iniatilize(size_orig = 1) @size = size_orig end
def acoplar(otro_lego) return MoldeLego.new(self.size + otro_lego.size) # devolvemos un lego de la suma del tamaño de los otros legos end
end
lego1 = MoldeLego.new lego2 = MoldeLego.new lego3 = lego1.acoplar(otro_lego)
Todavía podemos hacer una mejor más, en ruby al igual que otros lenguajes se puede redefinir una operación, en este caso vamos a redefinir la suma (sólo para los legos):
class MoldeLego attr_accessor:size
# Pasamos un valor al constructor # para poder crear legos de otros tamaños # en caso de que se omita es de tamaño 1 def iniatilize(size_orig = 1) @size = size_orig end
def +(otro_lego) return MoldeLego.new(self.size + otro_lego.size) # devolvemos un lego de la suma del tamaño de los otros legos end
end
Gracias a eso ahora podemos simplemente escribir:
lego1 = MoldeLego.new lego2 = MoldeLego.new lego3 = lego1 + lego2