04. Mezclándolo Todo

Hemos visto algunos tipos diferentes de objetos (números y letras), y hemos hecho variables para apuntar a ellos; lo siguiente que queremos hacer es conseguir que todos jueguen bien juntos.

Hemos visto que si queremos que un programa imprima 25, el siguiente código no funcionará, porque no puedes sumar números y strings:

var1 = 2
var2 = '5'

puts var1 + var2

Parte del problema es que tu computadora no sabe si estabas tratando de obtener 7 (2 + 5) o 25 ('2' + '5').

Antes de que podamos sumarlos, necesitamos alguna forma de obtener la versión string de var1, o de obtener la versión entera de var2.

Conversiones

Para obtener la versión string de un objeto, simplemente escribimos .to_s después de él:

var1 = 2
var2 = '5'

puts var1.to_s + var2
25

De manera similar, .to_i da la versión entera de un objeto, y .to_f da la versión float. Veamos qué hacen (y qué no hacen) estos tres métodos un poco más de cerca:

var1 = 2
var2 = '5'

puts var1.to_s + var2
puts var1 + var2.to_i
25
7

Observa que, incluso después de obtener la versión string de var1 llamando a .to_s, var1 siempre apuntaba a 2, y nunca a '2'. A menos que reasignemos explícitamente var1 (lo que requiere un signo =), apuntará a 2 durante la vida del programa.

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

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 '¿Quién te preguntó sobre el 5?'.to_i
puts 'Tu mamá.'.to_f
puts ''
puts 'cuerdoso'.to_s
puts 3.to_i
15.0
99.999
99

5
0
0.0

cuerdoso
3

Así que, probablemente hubo algunas sorpresas allí. La primera es bastante estándar, dando 15.0. Después de eso, convertimos la string '99.999' a un float y a un entero. El float hizo lo que esperábamos; el entero fue, como siempre, redondeado hacia abajo.

Luego, tuvimos algunos ejemplos de... strings inusuales siendo convertidas a números. .to_i ignora lo primero que no entiende, y el resto de la string desde ese punto en adelante. Así que la primera fue convertida a 5, pero las otras, dado que comenzaban con letras, fueron ignoradas completamente... así que la computadora simplemente elige cero.

Finalmente, vimos que nuestras dos últimas conversiones no hicieron nada en absoluto, tal como esperaríamos.

Otra Mirada a puts

Hay algo extraño en nuestro método favorito... Echa un vistazo a esto:

puts 20
puts 20.to_s
puts '20'
20
20
20

¿Por qué estas tres imprimen lo mismo? Bueno, las dos últimas deberían, ya que 20.to_s es '20'. Pero ¿qué pasa con la primera, el entero 20? Para el caso, ¿qué significa escribir el entero 20? Cuando escribes un 2 y luego un 0 en un pedazo de papel, estás escribiendo una string, no un entero. El entero 20 es el número de dedos de manos y pies que tengo; no es un 2 seguido de un 0.

Bueno, aquí está el gran secreto detrás de nuestro amigo puts: antes de que puts intente escribir un objeto, usa .to_s para obtener la versión string de ese objeto. De hecho, la s en puts significa string; puts realmente significa put string (poner string).

Esto puede no parecer muy emocionante ahora, pero hay muchos, muchos tipos de objetos en Ruby (¡incluso aprenderás a hacer los tuyos propios!), y es bueno saber qué pasará si intentas hacer puts de un objeto realmente extraño, como una foto de tu abuela, o un archivo de música o algo así. Pero eso vendrá después...

Mientras tanto, tenemos algunos métodos más para ti, y nos permiten escribir todo tipo de programas divertidos...

Los Métodos gets y chomp

Si puts significa put string, estoy seguro de que puedes adivinar lo que significa gets (get string, obtener string). Y así como puts siempre escupe strings, gets solo recuperará strings. ¿Y de dónde las obtiene?

¡De ti! Bueno, de tu teclado. Dado que tu teclado solo hace strings, esto funciona de maravilla. Lo que realmente sucede es que gets simplemente se queda allí, leyendo lo que escribes hasta que presionas Enter. Probémoslo:

puts gets
¿Hay eco aquí?
¿Hay eco aquí?

Por supuesto, lo que sea que escribas simplemente se te repetirá. Ejecútalo unas cuantas veces e intenta escribir cosas diferentes.

¡Ahora podemos hacer programas interactivos! En este, escribe tu nombre y te saludará:

puts 'Hola, ¿y cuál es tu nombre?'
name = gets
puts '¿Tu nombre es ' + name + '?  ¡Qué nombre tan bonito!'
puts 'Encantado de conocerte, ' + name + '.  :)'

¡Puaj! Acabo de ejecutarlo —escribí mi nombre— y pasó esto:

Hola, ¿y cuál es tu nombre?
Chris
¿Tu nombre es Chris
?  ¡Qué nombre tan bonito!
Encantado de conocerte, Chris
.  :)

Hmmm... parece que cuando escribí las letras C, h, r, i, s, y luego presioné Enter, gets obtuvo todas las letras de mi nombre y el Enter! Afortunadamente, hay un método para este tipo de cosas: chomp. Quita cualquier Enter que esté colgando al final de tu string. Intentemos ese programa de nuevo, pero con chomp para ayudarnos:

puts 'Hola, ¿y cuál es tu nombre?'
name = gets.chomp
puts '¿Tu nombre es ' + name + '?  ¡Qué nombre tan bonito!'
puts 'Encantado de conocerte, ' + name + '.  :)'
Hola, ¿y cuál es tu nombre?
Chris
¿Tu nombre es Chris?  ¡Qué nombre tan bonito!
Encantado de conocerte, Chris.  :)

¡Mucho mejor! Observa que como name apunta a gets.chomp, no tenemos que decir name.chomp; name ya fue "masticado" (chomped).

Algunas Cositas Para Probar

  • Escribe un programa que pida el nombre de una persona, luego el segundo nombre, y luego el apellido. Finalmente, debe saludar a la persona usando su nombre completo.
  • Escribe un programa que pida el número favorito de una persona. Haz que tu programa sume uno al número, y luego sugiera el resultado como un número favorito más grande y mejor. (Hazlo con tacto).

Una vez que termines esos dos programas (y cualquier otro que quieras probar), aprendamos algunos métodos más (y algo más sobre ellos).