sábado, 2 de abril de 2011

Ruby: Creando clases y objetos

Luego de tener idea básica del lenguaje y definición de métodos, veamos la creación de clases y objetos.
class Anfitrion
def initialize(nombre=”Mundo”)
@nombre = nombre
end

def decir_hola
puts “Hola #{@nombre)“
end

def decir_adios
puts “Adios #{@nombre}“
end

De esa forma tenemos una clase anfitrión con dos métodos (decir_hola, decir_adios). Además se tiene una variable de instancia (@nombre) disponible durante la vida del objeto. Para crear el objeto:

A = Anfitrion.new(“Bernardo“).
A.decir_hola => “Hola Bernardo“
A.decir_adios => “Adios Bernardo“

Una aspecto interesante es que no podemos acceder a la variable de instancia como sí se puede en otros lenguajes. La expresión A.@nombre no es válida.

Anfitrion.instance_methods devuelve todos los métodos de instancia que se pueden invocar. Eso retorna todos los métodos disponibles de la clase Anfitrion y sus superclases. Si quisiéramos solamente los métodos que se definieron en la clase anfitrión y nada más, entonces bastará con poner:
Anfitrion.instance_methods(false)
En este caso se retornará
 => “[decir_hola, decir_adios]“


Existe otra funcionalidad interesante que es la de respond_to?. Escribimos
 Anfitrion.respond_to?(“nombre“)

y retornará false. Sin embargo si escribimos Anfitrion.respond_to?(“decir_hola“) retornará true. Si el objeto es capaz de responder a esos métodos entonces retorna true.

Para poder acceder y modificar los valores de las variables de clase, es necesario poner attr_accessor: nombres.
De esa forma podemos acceder como a.nombre, donde a es el objeto instanciado de la clase Anfitrion.

Ejemplo....




class MegaAnfitrion
attr_accessor :nombres

# Crear el objeto
def initialize(nombres = "Mundo")
@nombres = nombres
end

# Decirle hola a todos
def decir_hola
if @nombres.nil?
puts "..."
elsif @nombres.respond_to?("each")

# @nombres es una lista de algún tipo,
# ¡así que podemos iterar!
@nombres.each do |nombre|
puts "Hola #{nombre}"
end
else
puts "Hola #{@nombres}"
end
end

# Decirle adiós a todos
def decir_adios
if @nombres.nil?
puts "..."
elsif @nombres.respond_to?("join")
# Juntar los elementos de la lista
# usando la coma como separador
puts "Adiós #{@nombres.join(", ")}. Vuelvan pronto."
else
puts "Adiós #{@nombres}. Vuelve pronto."
end
end

end



if __FILE__ == $0
ma = MegaAnfitrion.new
ma.decir_hola
ma.decir_adios

# Cambiar el nombre a "Diego"
ma.nombres = "Diego"
ma.decir_hola
ma.decir_adios

# Cambiar el nombre a un vector de nombres
ma.nombres = ["Alberto", "Beatriz", "Carlos",
"David", "Ernesto"]
ma.decir_hola
ma.decir_adios

# Cambiarlo a nil
ma.nombres = nil
ma.decir_hola
ma.decir_adios
end


Y hasta aquí llegué con Ruby. En cuanto profundice en él iré actualizando los posts. Saludos!

No hay comentarios:

Publicar un comentario