Siempre que Ruby crea un objeto nuevo, busca un método llamado initialize y lo ejecuta. Luego lo más sencillo que se puede hacer es utilizar este método para dar valores a las variables instancia, así el método inspect no tiene nada por lo que quejarse.
ruby> class Fruta
ruby| def initialize
ruby| @kind = "manzana"
ruby| @condition = "madura"
ruby| end
ruby| end
nil
ruby> f4 = Fruta.new
una manzana madura
Un objeto procedimiento nuevo se obtiene utilizando proc:
ruby> quux = proc {
ruby| print "QUUXQUUXQUUX!!!\n"
ruby| }
# Ahora quux referencia a un objeto y como las mayoría de los objetos, tiene un comportamiento que se puede invocar. Concretamente, podemos pedir que se ejecute a través de su método call ruby> quux.call
QUUXQUUXQUUX!!!
condicionales y ciclos:
Ruby proporciona medios adecuados para la construcción de bucles, aunque veremos en el siguiente capítulo que si se aprende a utilizar los iteradores a menudo hace innecesario su utilización explícita.
Un while es un if repetido. Se ha utilizado en nuestros programas acertijo adivina-palabra y en las expresiones regulares (ver el capítulo anterior); allí tomaba la forma while condición ... end que rodeaba el código a repetir mientras la condición fuera cierta. Pero while e if se pueden aplicar fácilmente a sentencias individuales:
ruby> i = 0Algunas veces se necesita la condición de comprobación negada. Un unless es un if negado y un until es un while negado. Dejamos estas sentencias para que se experimente con ellas.
0
ruby> print "Es cero.\n" if i == 0
Es cero.
nil
ruby> print "Es negativo\n" if i <> print "#{i+=1}\n" while i <>
Array
Se pueden crear un array listando elementos entre corchetes ([ ]) y separándolos por comas. Los arrays en Ruby pueden almacenar objetos de diferentes tipos.
ruby> ary = [1, 2, "3"]Los arrays se pueden concatenar y repetir, igual que las cadenas.
[1, 2, "3"]
ruby> ary + ["foo", "bar"]
[1, 2, "3", "foo", "bar"]
ruby> ary * 2
[1, 2, "3", 1, 2, "3"]
Se pueden utilizar índices numéricos para acceder a cualquier parte del array.
ruby> ary[0]
1
ruby> ary[0,2]
[1, 2]
ruby> ary[-2]
2
ruby> ary[-2,2]
[2, "3"]
ruby> ary[-2..-1]
[2, "3"]
A continuación examinaremos el programa acertijo del capítulo sobre las cadenas
01 words = ['foobar', 'baz', 'quux']
02 secret = words[rand(3)]
03
04 print "adivina? "
05 while guess = STDIN.gets
06 guess.chop!
07 if guess == secret
08 print "¡Ganas!\n"
09 break
10 else
11 print "Lo siento. Pierdes\n"
12 end
13 print "adivina? "
14 end
15 print "La palabra era ", secret, ".\n"
En este programa se utiliza una nueva estructura de control, while. El código entre el while y su correspondiente end se ejecutará repetidamente mientras la condición especificada se mantenga cierta.
rand(3) de la línea número 2 devuelve un número aleatorio dentro del rango de 0 a 2. Este número se utiliza para extraer uno de los elementos del array words.
En la línea 5 se lee una línea de la entrada estándar con el método STDIN.gets. Si aparece el fin del fichero (EOF - End Of File), gets devuelve nil. Por lo tanto el código asociado con el while se repetirá hasta encontrar un ^D (o ^Z bajo DOS), que representa el fin de fichero
En la línea 6 guess.chop! elimina el último carácter de guess; en este caso siempre el carácter de línea nueva.
En la línea 15 se imprime la palabra secreta. Se ha escrito como una sentencia print con tres argumentos (que se imprimen uno detrás del otro), pero hubiera tenido la misma efectividad el hacerlo con un único argumento escribiendo secret como #{secret} para resaltar que la variable se debe evaluar y no imprimir la palabra literal:
Metodos:En Ruby, se llama a un método con la notación punto (como en C++ o Java). El objeto con el que nos comunicamos se nombra a la izquierda del punto.
ruby> "abcdef".lengthIntuitivamente, a este objeto cadena se le está pidiendo que diga la longitud que tiene. Técnicamente, se está llamando al método length del objeto "abcdef".
6
Otros objetos pueden hacer una interpretación un poco diferente de length. La decisión sobre cómo responder a un mensaje se hace al vuelo, durante la ejecución del programa, y la acción a tomar puede cambiar dependiendo de la variable a que se haga referencia.
ruby> foo = "abc"
"abc"
ruby> foo.length
3
ruby> foo = ["abcde","fghij"]
["abcde", "fghij"]
ruby> foo.length
2