viernes, septiembre 28, 2012

[viernes, septiembre 28, 2012] Ruby :: Conversiones, puts, gets y chomp


Hemos observado algunos tipos de objetos diferentes hasta ahora: números y cadenas. También hemos hecho que variables contengan dichos objetos; lo siguiente que queremos hacer es complicar un poco más la cosa.

Hemos visto que si queremos que un programa imprima 25, lo siguiente no funciona, porque no podemos sumar números y cadenas:

Código:

var1 = 2
var2 = '5'
Resultado:
puts var1 + var2

Parte del problema es que tu computadora no sabe si tú estás intentando obtener 7 (2 + 5), o si estás intentando obtener '25' ('2' + '5').

Antes de que podamos sumarlos, necesitamos una forma de obtener la versión cadena de caracteres de var1 (que actualmente contiene un número), u obtener la versión en número entero de var2 (que actualmente contiene una cadena).

Conversiones
Para obtener la versión en cadena de caracteres de un objeto simplemente le agregamos .to_s al final:

Código:
var1 = 2
var2 = '5'
puts var1.to_s + var2
Resultado:
25

De forma similar, al agregar .to_i a una variable que contiene una cadena que tenga una serie de dígitos obtenemos la versión en número entero de dichos dígitos, y .to_f nos da la versión en número flotante. Veamos un poco más de cerca que es lo que estos tres métodos hacen (y no hacen):

Código:
var1 = 2
var2 = '5'
puts var1.to_s + var2
puts var1 + var2.to_i
Resultado:
25
7

Observa que aun después de que obtuvimos la versión en cadena de caracteres de var1 utilizando to_s, var1 continua conteniendo 2 y nunca a '2'. A menos que nosotros específicamente reasignemos var1 (lo que requiere el usar un signo =), ésta contendrá 2 por el resto del programa.

Ahora intentemos algunas conversiones más interesantes (y algunas extrañas):

Código:
puts '15'.to_f
puts '99.999'.to_f
puts '99.999'.to_i
puts '...'
puts '5 es mi número favorito'.to_i
puts '¿Quien te pregunto?'.to_i
puts 'Tu madre lo hizo.'.to_f
puts '...'
puts 'cadenita'.to_s
puts 3.to_i
Resultado:
15.0
99.999
99
...
5
0
0.0
...
cadenita
3

Esto probablemente te dio algunas sorpresas. El primer resultado es muy común, imprime 15.0. Después de eso, convertimos la cadena '99.999' a su versión en números flotante y entero. La conversión al flotante apareció como esperábamos, mientras que la del entero fue, como siempre, redondeado hacia abajo.

En la siguiente parte, tenemos algunos ejemplos de cadenas un poco... inusuales siendo convertidas en números. to_i ignora lo primero que no entiende y el resto de la cadena desde ese punto en adelante. Así que la primera fue convertida en 5, pero las otras, como comienzan con letras, fueron ignoradas completamente... por lo que la computadora simplemente elige cero.

Finalmente, vimos que las dos ultimas conversiones no hicieron absolutamente nada, justo como lo esperaríamos.

Otra mirada a puts
Hay algo extraño acerca de nuestro método favorito... Observa esto:

Código:
puts 20
puts 20.to_s
puts '20'
Resultado:
20
20
20

¿Por qué estos tres imprimen la misma cosa? Bueno, los últimos dos deberían hacerlo, ya que 20.to_s es '20' Pero, ¿qué hay del primero, el entero 20? Bueno, aquí está el gran secreto detrás de nuestro amigo puts: antes de que puts intente escribir un objeto, sin que nos demos cuenta usa to_s para obtener la versión en cadena de caracteres de ese objeto. De hecho, la s en puts se refiere a cadena; puts realmente significa imprimir cadena.

Esto puede no parecer muy emocionante ahora, pero hay muchos, muchos tipos de objetos en Ruby (¡hasta aprenderás a crear los tuyos propios!), y es bueno conocer que pasará si intentas usar puts en un objeto realmente raro, como una fotografía de la abuela, un archivo de música o algo. Pero eso vendrá después...

Mientras tanto, tenemos un par de métodos más para ti, y ellos te permiten escribir todo tipo de programas divertidos...

Los métodos gets y chomp
Si puts significa imprimir cadena, estoy seguro de que adivinas que significa gets. Y justo como puts siempre escupe cadenas de caracteres, gets sólo las atrapa. Y, ¿de dónde las obtiene? ¡De ti! Bueno, de tu teclado, al menos. Como las pulsaciones de tu teclado solo produce cadenas de caracteres, funciona de maravilla. gets simplemente se sienta ahí, releyendo lo que escribes hasta que presionas Enter.

Vamos a intentarlo:

Código:
puts gets
Resultado:
¿Hay eco aquí?
¿Hay eco aquí?

Claro, cualquier cosas que escribas te será simplemente repetida de regreso. Ejecuta el programa algunas veces e intenta escribir diferentes cosas.

¡Ahora podemos hace programas interactivos! En éste, escribe tu nombre y te saludará:

Código:
puts 'Hola... y, ¿cuál es tu nombre?'
nombre = gets
puts '¿Tu nombre es ' + nombre + '? ¡Qué nombre tan hermoso!'
puts 'Gusto en conocerte ' + nombre + '.   :)'
Resultado:
Hola... y, ¿cúal es tu nombre?
Chris
¿Tu nombre es Chris
? ¡Qué nombre tan hermoso!
Gusto en conocerte, Chris
.   :)

Hmmm... parece que cuando teclee las letras C, h, r, i, s, y entonces presione Enter gets tomo todas las letras de mi nombre y también el Enter! Por suerte, hay un método justo para solucionar este problema: chomp. El cual remueve cualquier Enter que esté colgando al final de tu cadena se caracteres. Intentemos el programa de nuevo, pero con chomp para ayudarnos ésta vez:

Código:
puts 'Hola... y, ¿cuál es tu nombre?'
nombre = gets.chomp
puts '¿Tu nombre es ' + nombre + '? ¡Qué nombre tan hermoso!'
puts 'Gusto en conocerte ' + nombre + '.   :)'
Resultado:
Hola... y, ¿cúal es tu nombre?
Chris
¿Tu nombre es Chris? ¡Qué nombre tan hermoso!
Gusto en conocerte, Chris.   :)

¡Mucho mejor! Nota que como la variable nombre comtiene lo que gets.chomp produjo (es decir, lo que escribe el usuario sin el Enter del final) no hace falta que usemos nombre.chomp.

0 comentarios:

Publicar un comentario