Está en la página 1de 3
INTRODUCCIÓN Ruby es un lenguaje interpretado de alto nivel, reflexivo y orientado a objetos, de

INTRODUCCIÓN

Ruby es un lenguaje interpretado de alto nivel, reflexivo y orientado a objetos, de la misma manera que lo es Java, por ejemplo.

Ruby fue publicado por Yukihiro Matsumoto en 1995 tras dos años de desarrollo. Basándose en el principio de mínima sorpresa, logró crear un lenguaje de programación sencillo e intuitivo en el que la orientación a objetos se lleva a un nuevo nivel.

En esta exposición trataremos de dar una visión general de Ruby, especialmente en los aspectos que difieren de Java, así como de las facilidades que le ofrece a los programadores que lo escojan para sus proyectos orientados a objetos.

RUBY Y LA ORIENTACIÓN A OBJETOS

La característica principal de Ruby es que todo es un objeto. Carece de tipos de datos primitivos, como pueden ser los enteros int en Java. Por ejemplo, el siguiente código es perfectamente válido:

puts (-34.56).abs.floor

# -> 34

en el que el Integer -34.56 es un objeto que contiene los métodos abs y floor predefinidos (nótese que el método abs retorna una referencia al número devuelto, pudiéndose sobre ella aplicar de nuevo el método floor). Si queremos ver todos los métodos predefinidos en un objeto podemos usar objeto.methods que devuelve un array listándolos.

Una de las consecuencias más impactantes de que todo sea un objeto es la posibilidad de asociar un bloque de código a una función y pasárselo como parámetro. Este código puede ser convertido a un objeto de tipo Proc o no dependiendo de si la función especifica explícitamente que ha de recibir dicho código. Por ejemplo:

def no_proc

yield

end

no_proc {

# codigo

# no se convierte

}

En este caso, la función no recibe ningún parámetro que sea un bloque de código, por tanto se usa la palabra clave yield para ejecutarlo y dicho bloque no es convertido.

def si_proc(&bloque) bloque.call end

si_proc {

# codigo

#

se convierte internamente

}

En cambio, en este segundo caso, el bloque pasa a ser un objeto de tipo Proc al pasárselo como argumento a la función, y se le llama con el método call de la clase Proc (a la que ahora pertenece) en vez de con yield.

En cuanto a la herencia múltiple, si bien Ruby no la soporta, posee un mecanismo para simularla de manera clara y limpia salvando los problemas que suele presentar esta metodología. Este mecanismo son los mixins, que podrían describirse como la manera en que una clase incluye uno o más módulos. Por ejemplo, Array es una clase que hereda de Object (como cualquier otra clase) e incluye el módulo Enumerable. Los mixins son similares a las interfaces de Java con la diferencia de que estas últimas no pueden contener código que implemente métodos, simplemente poseen la cabecera.

La flexibilidad de Ruby permite también definir métodos denominados singleton, que son aquellos que se definen en objetos individuales, no en clases. Es decir, podríamos tener un método doblar_cuchara que solo exista dentro del objeto uri_geller y no dentro de toda la clase Humano a la que pertenece:

class Humano

end

uri_geller = Humano.new tamariz = Humano.new

def uri_geller.doblar_cuchara puts “Cuchara doblada” end

uri_geller.doblar_cuchara

tamariz.doblar_cuchara

# -> “Cuchara doblada” # -> NoMethodError

Ruby se caracteriza por un duck-typing total (“Si anda como un pato y grazna como un pato, es un pato”), en contraste a Java que requiere algún tipo de relación de herencia entre la clase real y la que se necesita. En cierto modo, se podría decir que su polimorfismo es más completo. Véase el siguiente ejemplo aclaratorio:

class Periodico def leer() puts "Leyendo periódico" end end

class Libro def leer() puts "Leyendo libro" end end

biblioteca = [ Periodico.new, Libro.new ] biblioteca.each do |b| b.leer end # (salida por pantalla) -> “Leyendo periódico” “Leyendo libro”

Ruby permite modificar incluso las clases predefinidas del lenguaje. Es posible añadir métodos (tanto de clase como de instancia) a String, Integer, o cualquier otra.

class Integer def es_impar? (self % 2) == 1 end end puts 3.es_impar? # => true

En

definitiva,

Ruby

es

un

lenguaje

muy

potente

y

flexible

que

usa

la

programación orientada a objetos en toda su plenitud de una manera intuitiva,

permitiendo una total libertad sin arriesgar fiabilidad.

MÁS INFORMACIÓN

Para ampliar conocimientos sobre Ruby recomendamos los siguientes enlaces:

Página oficial de Ruby: incluye documentos muy útiles para el aprendizaje, así como un terminal interactivo desde el navegador para hacer pruebas sin necesidad de instalar el interprete en tu ordenador.

Rubíes: comunidad hispana de usuarios de Ruby.

Ruby en la Wikipedia (ingles): descripción general de las características de Ruby.

Why's (poignant) guide to Ruby La (patética) guía de Why sobre Ruby:

completa guía en ingles desde un enfoque humorístico.