Tutorial Ruby Peru
Tutorial Ruby Peru
Tutorial Ruby Peru
Introduccin a puts
Cmo es que funciona ese programa? Seguramente puedes
adivinar qu es lo que 1+2 hace; nuestro programa es
bsicamente lo mismo que:
puts 3
Enteros y flotantes
En la mayora de los lenguajes de programacin (y Ruby no es
la excepcin) los nmeros sin decimales son llamados enteros
(traduccin de integers en su versin en Ingls), y los nmeros
Aritmtica simple
Hasta ahora, tenemos todo lo que necesita una calculadora
simple. (Las calculadoras siempre usan flotantes, as que si
quieres que tu computadora acte como una calculadora,
tambin deberas usar flotantes). Para suma y resta, usamos +
y -, como ya lo vimos. Para la multiplicacin, usamos *, y para
la divisin usamos /. La mayora de los teclados tienen estas
teclas en el teclado numrico a la derecha. Intentemos expandir
1.0
2.0
5.0
9.0
+ 2.0
* 3.0
- 8.0
/ 2.0
1+2
2*3
5-8
9/2
una pelcula o dejar que una mitad suya vea la pelcula entera...
algunas cosas simplemente no son divisibles.
As que ahora experimenta con algunos programas por tu
cuenta! Si quiere escribir expresiones ms complejas, puede
usar parntesis. Por ejemplo:
Cdigo:
puts 5 * (12-8) + -15
puts 98 + (59872 / (13*8)) * -52
Resultado:
5
-29802
Textos
As que hemos aprendido todo acerca de nmeros, pero qu
acerca de letras? palabras? textos?
Nos referimos a grupos de letras en un programa como textos.
(T puedes pensar en letras impresas siendo ensartadas en un
cartel.) Aqu hay algunos textos:
'Hola.'
'Ruby la rompe.'
'5 es mi nmero favorito... Cul es el tuyo?'
'Snoopy dice #%^?&*@! cuando le aplastan el dedo del pie.'
'
'
''
Resultado:
Hola Mundo
Adis
Aritmtica de textos
Igual que hacer hacer aritmtica con nmeros, t puedes
tambin hacer aritmtica con textos! Bueno, algo as... puedes
sumar textos, digamos. Intentemos sumar dos textos y ver que
hace puts con eso.
Cdigo:
puts 'Me gusta' + 'el pastel de manzana.'
Resultado:
Me gustael pastel de manzana
Resultado:
Me gusta el pastel de manzana
Me gusta el pastel de manzana
Resultado:
12 vs '12'
Antes de ir ms all, debemos asegurarnos de entender la
diferencia entre nmeros y dgitos. 12 es un nmero, pero '12'
es un texto de dos dgitos.
Juguemos con esto un poco:
Cdigo:
puts 12 + 12
puts '12' + '12'
puts '12 + 12'
Resultado:
24
1212
12 + 12
Resultado:
10
22222
2 * 5
Problemas
En este punto podras haber probado algunas cosas que no
funcionaron. Si no lo has hecho, aqu hay algunas:
Cdigo:
puts '12' + 12
puts '2' * '5'
Resultado:
Mi
Resultado:
Mi nombre es O'hara!
barra invertida al final del texto: \
arriba\abajo
arriba\abajo
Variables
Hasta ahora, cuando usamos 'puts' para un texto o nmero,
esto desaparece. A lo que me refiero es que, si queremos
imprimir algo dos veces, necesitamos escribirlo dos veces:
Cdigo:
puts '...puedes decir eso de nuevo...'
puts '...puedes decir eso de nuevo...'
Resultado:
Resultado:
Resultado:
Resultado:
puts var
Resultado:
solo otro texto
15
Resultado:
8
8
ocho
8
Mezclando
Hemos revisado distintos tipos de objetos (nmeros y textos) y
hemos hecho que variables apunten a ellos; lo que queremos
Resultado:
in `+': String can't be coerced into Fixnum (TypeError)
Conversiones
Para obtener la representacin en texto de un objeto,
simplemente escribiendo .to_s despus de el objeto:
Cdigo:
var1 = 2
var2 = '5'
puts var1.to_s + var2
Resultado:
25
Resultado:
25
7
'15'.to_f
'99.999'.to_f
'99.999'.to_i
'5 es mi numero favorito.'.to_i
'Quin pregunta acerca de 5 o lo que sea?'.to_i
'Tu mam hizo.'.to_f
'fibroso'.to_s
3.to_i
Resultado:
15.0
99.999
99
5
0
0.0
fibroso
3
Resultado:
20
20
20
Resultado:
Resultado:
Ms acerca de
Mtodos
Hemos visto diferentes mtodos: puts, gets, etc. (Prueba: Listar
todos los mtodos que hemos visto hasta ahora!. Hay diez de
ellos, la respuesta est abajo), pero no hemos realmente
hablado sobre que hacen los mtodos. Sabemos que hacen,
pero no lo que son.
Resultado:
hola mundo
99
Resultado:
3
in `<main>': private method `puts' called for main:Object
(NoMethodError)
puts
puts
puts
puts
puts
puts
var1.reverse
var2.reverse
var3.reverse
var1
var2
var3
Resultado:
rarap
odayarbus
?sever la nicaro atse raicnunorp sedeuP
parar
subrayado
Puedes pronunciar esta oracin al reves?
Resultado:
Cul es tu nombre completo?
Christopher David Pine
#<TypeError: can't convert Fixnum into String>
Cdigo:
puts 'Cul es tu nombre completo?'
name = gets.chomp
puts 'Sabas que hay ' + name.length.to_s + ' caracteres en tu
nombre, ' + name + '?'
Resultado:
Resultado:
AABBCCDDEE
aabbccddee
AaBbCcDdEe
Aabbccddee
a
aAbBcCdDeE
Resultado:
Old Mother Hubbard
Sat in her cupboard
Eating her curds an whey,
When along came a spider
lineWidth = 40
str = '--> text <--'
puts str.ljust lineWidth
puts str.center lineWidth
puts str.rjust lineWidth
puts str.ljust(lineWidth/2) + str.rjust(lineWidth/2)
Resultado:
--> text <---> text <---> text <---> text <---> text <--
pgina 1
pgina 72
pgina 118
Matemticas Avanzadas
Ms de aritmtica
Los otros dos mtodos aritmticos son ** (potencia) y %
(mdulo). Entonces si quieres decir "cinco al cuadrado" en
Ruby, deberas escribir algo as 5**2. Tambin puedes usar
flotantes para tus exponentes, entonces si quieres una raz
cuadrada de 5, deberas escribir 5**0.5. Los mtodos mdulo te
dan el sobrante despus de una divisin por un nmero.
Entonces, por ejemplo, si divido 7 por 3, obtengo 2 con un
remanente de 1. Vamos a ver como es que trabaja en un
programa:
Cdigo:
puts
puts
puts
puts
puts
5**2
5**0.5
7/3
7%3
365%7
Resultado:
25
2.23606797749979
2
1
1
Resultado:
3
3
Nmeros aleatorios
Ruby viene con un lindo generador de nmeros aleatorios. El
mtodo para obtener un nmero aleatorio es rand. Si llamas
rand , obtendrs un nmero flotante mayor o igual a 0.0 y menor
a 1.0. Si le proporcionas a rand un nmero entero (5 por
ejemplo), esto te devolver un entero mayor o igual a 0 y menor
a 5 (entonces son cinco nmeros posibles, de 0 a 4).
Resultado:
0.866769322351658
0.155609260113273
0.208355946789083
61
46
92
0
0
0
2298247750813186023195410877388752386160069398951849569
9862
El pronosticador del tiempo dijo que hay 47% chances de que llueva,
pero nunca debes confiar en el.
Resultado:
24
35
36
58
70
24
35
36
58
70
Esto har la misma cosa cada vez que inicies con el mismo
nmero. Si quieres obtener diferentes nmeros(como pasara si
nunca utilizaras srand), entonces slo llamas a srand 0. Esto
El Objeto Math
Finalmente, vamos a echar un vistazo al objeto Math.
Deberamos ir directamente a este:
Cdigo:
puts(Math::PI)
puts(Math::E)
puts(Math.cos(Math::PI/3))
puts(Math.tan(Math::PI/4))
puts(Math.log(Math::E**2))
puts((1 + Math.sqrt(5))/2)
Resultado:
3.14159265358979
2.71828182845905
0.5
1.0
2.0
1.61803398874989
Control de Flujo
Ahhhh, control de flujo. Ac es donde todo empieza a encajar.
A pesar que este captulo es ms corto y facil que el captulo de
mtodos, te abrir un mundo nuevo de posibilidades para
programar.
Luego de este captulo, seremos capaces de escribir
programas realmente interactivos; previamente hemos creado
programas que dicen distintas cosas dependiente de lo que
ingreses en tu teclado, pero luego de este captulo estos
tambin harn distintas cosas. Pero antes que podamos hacer
eso, necesitamos ser capaces de comparar objectos en
nuestros programas. Necesitamos...
Mtodos de comparacin
Avancemos rpidamente por esta seccin para que podamos ir
a la siguiente, Ramificaciones, donde todas las cosas geniales
ocurren. Entonces, para ver si un objeto es mayor o menor que
otro, usaremos los mtodos > y <, as:
Cdigo:
puts 1 > 2
puts 1 < 2
Resultado:
false
true
Resultado:
true
false
Resultado:
true
true
Resultado:
true
Ramificaciones
Las Ramificaciones son un concepto simple, pero poderoso. De
hecho, es tan simple que no necesito explicarlo, solo te lo
mostrar:
Cdigo:
puts 'Hola, cual es tu nombre?'
name = gets.chomp
puts 'Hola, ' + name + '.'
if name == 'Chris'
puts 'Que nombre tan hermoso!'
end
si respondemos 'Chris':
Hola, cual es tu nombre?
Chris
Hola, Chris.
Que nombre tan hermoso!
si respondemos 'Chris':
Chris
Veo grandes cosas en tu futuro.
Bucles
A veces querrs que tu computadora haga la misma accin una
y otra vez despus de todo se supone que en eso son
Respuesta:
Hola?
Hola?
Hola!
Hola!
Un gusto conocerlo
Un gusto conocerlo
Oh... que amable!
Oh... que amable!
adios
Vuelve pronto!
Un poco de lgica
Echmosle un vistazo a nuestro primer programa de
condicionales una vez ms. Qu pasara si mi esposa llega a
casa, ve el programa, lo prueba y ste no le dice que ella tiene
un nombre hermoso. Yo no querra herir sus sentimientos (o
dormir en el silln) as que reescribmoslo:
Cdigo:
puts 'Hola, cual es tu nombre?'
nombre = gets.chomp
puts 'Hola, ' + nombre + '.'
if nombre == 'Chris'
puts 'Que nombre tan hermoso!'
else
if nombre == 'Katy'
puts 'Que nombre tan hermoso!'
end
end
Respuesta:
Respuesta:
puts
puts
puts
puts
puts
puts
puts
puts
puts
puts
puts
puts
Respuesta:
true
false
false
false
true
true
true
false
true
false
Matrices e Iteraciones
Vamos a escribir un programa el cual nos pida digitar tantas
palabras como nosotros querramos (una palabra por lnea),
continuando hasta que oprimamos Enter en una lnea vacia), el
cual luego nos devolver las palabras en orden alfabetico. OK?
Entonces... nosotros primero vamos; uh... um... hmmm...
Bueno, nosotros podramos; er... um...
T sabes, no pienso que podamos hacer esto. Necesitamos
una forma de almacenar una cantidad desconocida de palabras
y como obtener todas ellas juntas, entonces no se confundan
con otras variables. Necesitamos colocarlas en un tipo de lista.
Lo que necesitamos son matrices.
Una matriz es solo una lista en su computadora. Cada posicin
names
names[0]
names[1]
names[2]
names[3] # Este esta fuera del rango.
Resultado:
Ada
Belle
Chris
Ada
Belle
Chris
El Metodo 'each'
nos permite hacer algo (lo que queramos) a cada objeto
que apunte. Asi, si queremos decir algo bueno acerca de cada
lenguaje en la matriz de abajo, podriamos hacer esto:
'each'
Cdigo:
lenguajes = ['Ingls', 'Alemn', 'Ruby']
lenguajes.each do |leng|
puts 'Me gusta ' + leng + '!'
puts 'A ti?'
end
puts 'Y vamos a escuchar esto para C++!'
puts '...'
Resultado:
Me gusta Ingls!
A t?
Me gusta Alemn!
A t?
Me gusta Ruby!
A t?
Y vamos a escuchar esto para C++!
...
Resultado:
Hip-Hip-Hooray!
Hip-Hip-Hooray!
Hip-Hip-Hooray!
alimentos
alimentos.to_s
alimentos.join(', ')
alimentos.join(' :) ') + ' 8)'
200.times do
puts []
end
Resultado:
artichoke
brioche
caramel
["artichoke", "brioche", "caramel"]
Resultado:
lluvia de rosas
whisky en gatitos
2
whisky en gatitos
lluvia de rosas
1
Mtodos Propios
Como hemos visto anteriormente, los bucles e iteradores nos
permiten hacer lo mismo (o ejecutar el mismo cdigo) una y
otra vez. Sin embargo, a veces queremos hacer algo una
determinada cantidad de veces pero desde distintos lugares en
'Interrogatorio:'
'Gracias por tomarse el tiempo para ayudar con'
'este experimento. De hecho, este experimento'
'no tiene nada que ver con la comida mexicana. Es'
'un experimento sobre mojar la cama. La comida mexicana'
'ah para atraparte con la guardia baja'
'con la esperanza de que respondera ms'
'honestamente. Gracias de nuevo.'
mojasLaCama
Resultado:
Hola, y gracias por tomarse el tiempo para
que me ayude con este experimento. Mi experimento
tiene que ver con tu gusto acerca de
la comida mexicana. Basta con pensar en la comida mexicana
y tratar de contestar todas las preguntas con honestidad,
ya sea con un "s" o un "no". Mi experimento
no tiene nada que ver con mojar la cama.
Te gusta comer tacos?
si
Te gusta comer burritos?
si
Mojas la cama?
de ninguna manera
Por favor, responda "si" o "no".
Mojas la cama?
NO
Te gusta comer chimichangas?
si
Solo una cuantas preguntas ms...
Te gusta comer sopapillas?
si
Interrogatorio:
Gracias por tomarse el tiempo para ayudar con
este experimento. De hecho, este experimento
no tiene nada que ver con la comida mexicana. Es
un experimento sobre mojar la cama. La comida mexicana
ah para atraparte con la guardia baja
con la esperanza de que respondera ms
honestamente. Gracias de nuevo.
false
puts 'muuuuuu...'
end
Resultado:
muuuuuu...
muuuuuu...
coin-coin
muuuuuu...
muuuuuu...
Ah, mucho mejor. (En caso que no hables francs, eso fue un
pato francs en medio del programa. En Francia los patos dicen
coin-coin.)
Por lo tanto, definimos el mtodo de decirMu. (Nombres de los
mtodos, al igual que los nombres de variables, comienzan con
letras minsculas. Hay unas pocas excepciones, tales como +
o ==.) Pero los mtodos no siempre tienen que estar
asociados con objetos?. Bueno, s, y en este caso (como
sucede con puts y gets), el mtodo slo est asociado con el
objeto que representa la totalidad del programa. En el prximo
captulo veremos cmo agregar mtodos a otros objetos. Pero
primero ...
Resultado:
muuuuuuu...muuuuuuu...muuuuuuu...
oink-oink
in `decirMu': wrong number of arguments (0 for 1) (ArgumentError)
Variables Locales
En el siguiente programa hay dos variables:
Cdigo:
def duplicaEsto num
numeroVeces2 = num*2
puts num.to_s+' el doble es '+numeroVeces2.to_s
end
duplicaEsto 44
Resultado:
44 el doble es 88
Resultado:
44 el doble es 88
in `<main>': undefined local variable or method `numeroVeces2' for
main:Object (NameError)
Resultado:
HAHA! He malogrado tu variable!
Tu ni siquiera puedes tocar mi variable!
Valores de Retorno
Puedes haber notado que algunos mtodos envan algo de
regreso cuando son llamados. Por ejemplo, gets retorna una
cadena (la cadena que escribiste), y el mtodo + en 5+3, (que
es en realidad 5.+(3)) devuelve 8. Los mtodos aritmticos para
los nmeros retornan nmeros y los mtodos aritmticos para
los textos devuelven textos.
Es importante entender la diferencia entre los mtodos que
devuelven un valor al mtodo que lo llam, y lo que el programa
muestra en la pantalla como hace puts. Ten en cuenta que 5+3
retorna 8, cosa que no hace la salida 8.
Entonces, qu es lo que hace puts al retornar? No nos import
antes, pero vamos a ver ahora:
Cdigo:
valorRetorno = puts 'Esto es lo que puts retorna:'
puts valorRetorno
Resultado:
Resultado:
muuuuuu... muuuuuuu...
submarino amarillo
if reply == 'si'
answer = true
else
answer = false
end
else
puts 'Por favor, responder "si" o "no".'
end
end
answer # Esto es lo que retorna (`true` o `false`).
end
puts 'Hola, y gracias por...'
puts
preguntar 'Te gusta comer tacos?'
# Ignoramos la respuesta.
preguntar 'Te gusta comer burritos?'
mojasLaCama = preguntar 'Mojas la cama?' # Salvamos el valor
retornado.
preguntar 'Te gusta comer chimichangas?'
preguntar 'Te gusta comer sopapillas?'
preguntar 'Te gusta comer tamales?'
puts 'Solo unas preguntas mas...'
preguntar 'Te gusta beber horchata?'
preguntar 'Te gusta comer flautas?'
puts
puts 'Interrogatorio:'
puts 'Gracias por...'
puts
puts mojasLaCama
Resultado:
Te gusta comer tacos?
si
Te gusta comer burritos?
si
Mojas la cama?
de ninguna manera
Por favor, responder "si" o "no".
Mojas la cama?
NO
Te gusta comer chimichangas?
si
Te gusta comer sopapillas?
si
Te gusta comer tamales?
si
Un ejemplo ms grande
Creo que otro mtodo como ejemplo podra ser til aqu.
Llamaremos a este numeroEnEspanol. Se llevar un nmero,
como 22, y devolver la versin en espaol de la misma (en
este caso el texto de 'veintids') Por ahora, vamos a trabajar
solamente con nmeros enteros entre 0 a 100.
(*NOTA:** Este mtodo utiliza un nuevo truco para retornar en
forma temprana en el mtodo usando return e introduce un
nuevo giro en las bifurcaciones: elsif. Debe quedar claro en el
contexto de cmo funcionan estos.)*
Cdigo:
def numeroEnEspanol numero
# Solo estamos considerando los nmeros de 0-100.
if numero < 0
return 'Por favor ingrese un numero mayor o igual a cero.'
end
if numero > 100
return 'Por favor ingrese un numero menor o igual a 100'
end
numeroDeTexto = '' # Esta es el texto que retorna.
# "izquierda" es cuanto del nmero an falta escribir.
# "escrito" es la parte que estamos escribiendo en estos
momentos.
# escrito y izquierda... lo captas? :)
izquierda = numero
escrito = izquierda/100
# Cuantos cientos faltan escribir?
izquierda = izquierda - escrito*100 # Restar estos cientos.
if escrito > 0
return 'cien'
end
escrito = izquierda/10
# Cuantas decenas faltan escribir?
izquierda = izquierda - escrito*10 # Restar las decenas.
if escrito > 0
if escrito == 1 # Ah-ah...
# No podemos escribir "diezidos" en lugar de "doce",
# hemos realizado una excepcin especial .
if izquierda == 0
numeroDeTexto = numeroDeTexto + 'diez'
elsif izquierda == 1
numeroDeTexto = numeroDeTexto + 'once'
elsif izquierda == 2
numeroDeTexto = numeroDeTexto + 'doce'
elsif izquierda == 3
numeroDeTexto = numeroDeTexto + 'trece'
elsif izquierda == 4
numeroDeTexto = numeroDeTexto + 'catorce'
elsif izquierda == 5
numeroDeTexto = numeroDeTexto + 'quince'
elsif izquierda == 6
numeroDeTexto = numeroDeTexto + 'dieciseis'
elsif izquierda == 7
numeroDeTexto = numeroDeTexto + 'diecisiete'
elsif izquierda == 8
numeroDeTexto = numeroDeTexto + 'dieciocho'
elsif izquierda == 9
numeroDeTexto = numeroDeTexto + 'diecinueve'
end
# Desde que ya tomamos el digito faltante,
# ya no tenemos nada que escribir.
izquierda = 0
elsif escrito == 2
# Como no podemos decir "veinteiuno",
# tenemos que eliminar la "e" final.
if izquierda == 0
numeroDeTexto = numeroDeTexto + 'veinte'
else
numeroDeTexto = numeroDeTexto + 'veint'
end
elsif escrito == 3
numeroDeTexto = numeroDeTexto + 'treinta'
elsif escrito == 4
numeroDeTexto = numeroDeTexto + 'cuartenta'
elsif escrito == 5
numeroDeTexto = numeroDeTexto + 'cincuenta'
elsif escrito == 6
numeroDeTexto = numeroDeTexto + 'sesenta'
elsif escrito == 7
numeroDeTexto = numeroDeTexto + 'setenta'
elsif escrito == 8
numeroDeTexto = numeroDeTexto + 'ochenta'
elsif escrito == 9
numeroDeTexto = numeroDeTexto + 'noventa'
end
if izquierda > 0
numeroDeTexto = numeroDeTexto + 'i'
end
end
escrito = izquierda # Cuanto falta para el nmero?
izquierda = 0
# Restar lo que falta.
if escrito > 0
if escrito == 1
numeroDeTexto =
elsif escrito == 2
numeroDeTexto =
elsif escrito == 3
numeroDeTexto =
elsif escrito == 4
numeroDeTexto =
elsif escrito == 5
numeroDeTexto =
elsif escrito == 6
numeroDeTexto =
elsif escrito == 7
numeroDeTexto =
elsif escrito == 8
numeroDeTexto =
elsif escrito == 9
numeroDeTexto =
end
end
numeroDeTexto + 'uno'
numeroDeTexto + 'dos'
numeroDeTexto + 'tres'
numeroDeTexto + 'cuatro'
numeroDeTexto + 'cinco'
numeroDeTexto + 'seis'
numeroDeTexto + 'siete'
numeroDeTexto + 'ocho'
numeroDeTexto + 'nueve'
if numeroDeTexto == ''
# La unica forma que "numeroDeTexto" este vacio es que
# "numero" sea 0.
return 'cero'
end
# Si numeroDeTexto os hasta hasta aqui es que tenemos un numero
# entre 0 y 100, por lo que debemos retornar "numeroDeTexto".
numeroDeTexto
end
puts
puts
puts
puts
puts
puts
puts
puts
puts
numeroEnEspanol( 0)
numeroEnEspanol( 9)
numeroEnEspanol( 10)
numeroEnEspanol( 21)
numeroEnEspanol( 17)
numeroEnEspanol( 32)
numeroEnEspanol( 88)
numeroEnEspanol( 99)
numeroEnEspanol(100)
Resultado:
cero
nueve
diez
veintiuno
diecisiete
treintaidos
ochentaiocho
noventainueve
cien
if numero == 0
return 'cero'
end
# No mas casos especiales! No mas returns!
numeroDeTexto = '' # Esta es el texto que se retornara.
primeraPosicion = ['uno',
'dos',
'tres', 'cuatro',
'cinco',
'seis',
'siete',
'ocho', 'nueve']
segundaPosicion = ['diez',
'veinte', 'treinta', 'cuarenta',
'cincuenta',
'sesenta', 'setenta', 'ochenta', 'noventa']
entre11Y19 = ['once', 'doce', 'trece', 'catorce', 'quince',
'dieciseis', 'diecisiete', 'dieciocho', 'diecinueve']
entre21Y29 = ['veintiuno', 'veintidos', 'veintitres', 'veinticuatro',
'veinticinco',
'veintiseis', 'veintisiete', 'veintiiocho', 'veintinueve']
# "izquierda" es cuanto del numero aun falta escribir
# "escrito" es la parte que estamos escribiendo en este momento.
# escrito y izquierda... lo captas? :)
izquierda = numero
escrito = izquierda/100
# Cuantos cientos faltan escribir?
izquierda = izquierda - escrito*100 # La esta de estos cientos
if escrito > 0
# Ahora hacemos un pequeo truco:
cientos = numeroEnEspanol escrito
numeroDeTexto = numeroDeTexto + cientos + ' ciento'
# Eso se llama "recursividad". Entonces, Qu acabo de hacer?
# Le dije a este mtodo para llamarse a s mismo, pero con
"escrito" en vez de
# "numero". Recuerde que "escrito" es (por el momento) el nmero
de
# cientos que tenemos que escribir. Despus aadimos "hundred"
de "numeroDeTexto",
# aadimos la cadena 'cien' despus de l. As, por ejemplo, si
# se llam originalmente numeroEnEspanol con el 1999 (por lo que
"numero" = 1999),
# y luego en este momento "escrito" sera 19, y la "izquierda" sera
99.
# La ms perezoso que se puede hacer en ese momento es que
numeroEnEspanol
# escriba 'diecinueve' para nosotros, entonces escribimos 'cien',
# y luego el resto de numeroEnEspanol escribe "noventa y nueve".
if izquierda > 0
# So escribir 'dos ciencincuentaiuno'...
numeroEnEspanol(
numeroEnEspanol(
numeroEnEspanol(
numeroEnEspanol(
numeroEnEspanol(
numeroEnEspanol(
0)
9)
10)
11)
17)
32)
puts
puts
puts
puts
puts
puts
puts
puts
numeroEnEspanol( 88)
numeroEnEspanol( 99)
numeroEnEspanol(100)
numeroEnEspanol(101)
numeroEnEspanol(234)
numeroEnEspanol(3211)
numeroEnEspanol(999999)
numeroEnEspanol(1000000000000)
Resultado:
cero
nueve
diez
once
diecisiete
treintaidos
ochentaiocho
noventainueve
uno ciento
uno ciento uno
dos ciento treintaicuatro
treintaidos ciento once
noventainueve ciento noventainueve ciento noventainueve
uno ciento ciento ciento ciento ciento ciento
Clases
Hasta ahora hemos visto diferentes tipos o clases de objetos:
textos, enteros, flotantes, matrices, y algunos objetos
especiales (true, false y nil) de los cuales hablaremos ms
tarde. En Ruby, estas clases estn siempre en maysculas:
String, Integer, Float, Array ... etc. En general, si queremos crear
un nuevo objeto de una cierta clase, usamos new:
Cdigo:
a = Array.new + [12345] # Array agregado.
b = String.new + 'hello' # String agregado.
c = Time.new
puts 'a = '+a.to_s
puts 'b = '+b.to_s
puts 'c = '+c.to_s
Resultado:
a = [12345]
b = hello
c = 2012-06-01 12:52:06 -0500
Porque podemos crear matrices y textos usando [...] y ' ... '
respectivamente es que rara vez los creamos usando new.
(Aunque no es muy evidente en el ejemplo anterior, String.new
crea una cadena vaca y Array.new crea una matriz vaca)
Tambin, los nmeros son excepciones especiales: no se
puede crear un nmero entero con Integer.new . Slo tienes que
escribir el nmero entero.
La clase Time
Entonces, cul es la historia con la clase Time?. Los objetos
Time representan momentos en el tiempo. Usted puede sumar
(o restar) nmeros a (o desde) para obtener los nuevos
tiempos: la adicin de 1.5 a un tiempo hace un tiempo nuevo
segundo y medio ms tarde:
Cdigo:
hora = Time.new # El momento que se ejecut esta cdigo
hora2 = hora + 60 # Un minuto ms tarde.
puts hora
puts hora2
Resultado:
2012-06-01 12:55:49 -0500
2012-06-01 12:56:49 -0500
Resultado:
2000-01-01 00:00:00 -0500
1976-08-03 10:11:00 -0500
La clase Hash
Otra clase muy til es Hash. Los valores hash son muy
parecidos a las matrices: tienen un montn de ranuras que
pueden apuntar a objetos diferentes. Sin embargo, en una
matriz, las ranuras estn alineados en una fila y cada uno est
numerado (empezando de cero). En un hash, las ranuras no
estn en una fila (que es slo un tipo de mezcla), y se puede
utilizar cualquier objeto para hacer referencia a un espacio no
slo un nmero. Es bueno utilizar hashes cuando se tiene un
montn de cosas que no se desea perder de vista, pero que en
realidad no encajan en una lista ordenada. Por ejemplo los
colores que yo uso para las diferentes partes del cdigo con las
que he creado este tutorial:
Cdigo:
colorArray = [] # igual a Array.new
colorHash = {} # igual a Hash.new
colorArray[0]
= '#FF0000'
colorArray[1]
= '#008000'
colorArray[2]
= '#0000FF'
colorHash['textos '] = '#FF0000' # rojo
colorHash['numeros'] = '#008000' # verde
colorHash['claves '] = '#0000FF' # azul
colorArray.each do |color|
puts color
end
colorHash.each do |tipoCodigo, color|
puts tipoCodigo + ' : ' + color
end
Resultado:
#FF0000
#008000
#0000FF
textos : #FF0000
numeros : #008000
claves : #0000FF
Resultado:
cinco
cincuenta y ocho
Creando clases
Hemos visto diferentes clases de objetos. Sin embargo, es fcil
llegar a los tipos de objetos que Ruby no tiene. Por suerte, la
creacin de una nueva clase es tan fcil como la ampliacin de
una antigua. Digamos que hemos querido hacer algunos dados
en Ruby. As es como podemos hacer la clase Dado:
Cdigo:
class Dado
def roll
1 + rand(6)
end
end
# Vamos a crear un par de dados...
dados = [Dado.new, Dado.new]
# ...y hacerlos rodar.
dados.each do |dado|
puts dado.roll
end
Resultado:
3
4
Variables de instancia
Normalmente cuando queremos hablar de un texto, nos
limitaremos a llamar a un texto. Sin embargo, tambin podra
llamar un objeto de texto. Sin embargo, los programadores
podran llamar una instancia de la clase String, pero esto es
slo una manera de representar a texto. Una instancia de una
clase es slo un objeto de esa clase.
Por lo tanto las variables de instancia son variables de un
objeto. Las variables locales de un mtodo viven hasta que el
mtodo ha terminado. Las variables de instancia de un objeto,
por otro lado, duran tanto como el objeto. Para diferenciar las
variables de instancia de las variables locales, ellos tienen @
delante de sus nombres:
Cdigo:
class Dado
def rodar
@numeroMostrado = 1 + rand(6)
end
def mostrar
@numeroMostrado
end
end
dado = Dado.new
dado.rodar
puts dado.mostrar
puts dado.mostrar
dado.rodar
puts dado.mostrar
puts dado.mostrar
Resultado:
1
1
5
5
Resultado:
nil
class Dado
def initialize
# Voy a tirar el dado, a pesar de que
# podria hacer otra cosa si quisieramos
rodar
end
def rodar
@numeroMostrado = 1 + rand(6)
end
def mostrar
@numeroMostrado
end
end
puts Dado.new.mostrar
Resultado:
6
end
def lanzar
puts 'Lanzas a ' + @nombre + ' en el aire.'
puts 'Sonrie, sus cejas se mueven.'
pasoDelTiempo
end
def acunar
puts 'Acunas a ' + @nombre + ' suavemente.'
@dormido = true
puts 'Rapidamente se queda dormido...'
pasoDelTiempo
if @dormido
@dormido = false
puts '...pero despierta cuando te detienes.'
end
end
private
# "private" significa que los metodos definidos aqui son
# metodos internos al objeto. (Puedes alimentar a
# tu dragon, pero no puedes preguntar si esta hambriento.)
def hambriento?
# Los nombres de los metodos pueden terminar en "?".
# Generalmente, hacemos esto si el mtodo debe
# devolver verdadero o falso, como esto:
@panzaLlena <= 2
end
def ganas?
@intestinoLleno >= 8
end
def pasoDelTiempo
if @panzaLlena > 0
# Mueve el alimento del vientre al intestino.
@panzaLlena
= @panzaLlena
-1
@intestinoLleno = @intestinoLleno + 1
else # Nuestro dragon esta hambriento!
if @dormido
@dormido = false
puts 'Se despierta de repente!'
end
puts '' + @nombre + ' esta hambriento! En su desesperacion, te
COMIO!'
exit # Sale del programa.
end
if @intestinoLleno >= 10
@intestinoLleno = 0
puts 'Uy! ' + @nombre + ' tuvo un accidente...'
end
if hambriento?
if @dormido
@dormido = false
puts 'Se despierta de repente!'
end
puts 'El estomago de ' + @nombre + 'retumba...'
end
if ganas?
if @dormido
@dormido = false
puts 'Se despierta de repente!'
end
puts @nombre + ' hace la danza del bao...'
end
end
end
mascota = Dragon.new 'Norbert'
mascota.alimentar
mascota.lanzar
mascota.caminar
mascota.dormir
mascota.acunar
mascota.dormir
mascota.dormir
mascota.dormir
mascota.dormir
Resultado:
Norbert nace.
Alimentas a Norbert.
Lanzas a Norbert en el aire.
Sonrie, sus cejas se mueven.
Haces caminar a Norbert.
Colocas a Norbert en la cama.
Norbert ronca, llenando el cuarto con humo.
Norbert ronca, llenando el cuarto con humo.
Norbert ronca, llenando el cuarto con humo.
Norbert despierta lentamente.
Acunas a Norbert suavemente.
Rapidamente se queda dormido...
Bloques y
Procedimientos
Esta es definitivamente una de las mejores herramientas de
Ruby. Algunos lenguajes tienen esta herramienta, pienso que la
llamaran de otra forma (como closures), pero la mayora de los
ms populares no lo hacen, una pena.
Entonces qu es esto que es tan bueno? Esto tiene la
habilidad de tomar un bloque de cdigo (cdigo entre do y end)
y encapsularlo dentro de un objeto (llamado proc) y guardarlo
en una variable o pasarlo a un mtodo, y ejecutar el cdigo del
bloque donde te guste (ms de una vez, si quieres) Entonces
esto es como un tipo mtodo excepto que no est dentro de un
objeto (este bloque es un objeto), y puedes almacenarlo o
pasarlo como cualquier otro objeto. Es hora de un ejemplo:
Cdigo:
toast = Proc.new do
puts 'Aplausos!'
end
toast.call
toast.call
toast.call
Resultado:
Aplausos!
Aplausos!
Aplausos!
como un mtodo.
En realidad, son ms parecidos a los mtodos que te he
mostrado, porque los bloques pueden tomar parmetros:
Cdigo:
teGusta = Proc.new do |algoRico|
puts 'Me gusta *realmente* el '+algoRico+'!'
end
teGusta.call 'chocolate'
teGusta.call 'ruby'
Resultado:
Muy bien, entonces hemos visto que son los bloques y procs, y
como usarlos, pero cul es el punto? Porqu no utilizar
simplemente mtodos? Bueno, esto es porque hay ms cosas
que no podemos hacer con mtodos. En particular, no puedes
pasar mtodos a otros mtodos (pero puedes pasar procs
dentro de mtodos), y mtodos no pueden retornar otros
mtodos (pero ellos pueden retornar procs). Esto es
simplemente porque procs son objetos; los mtodos no son
objetos
(De hecho, es algo familiar para t? S, tu has visto bloques
antes... cuando aprendiste sobre iteradores. Pero vamos a
hablar un poco ms acerca de esto en breve)
Resultado:
Resultado:
<mirada>
<parpadeo>
<parpadeo>
<mirada>
<mirada>
end
end
siempreFalso = Proc.new do |soloIgnorame|
false
end
puts hacerHastaQueSeaFalso([5],
construirMatrizDeCuadrados).inspect
puts hacerHastaQueSeaFalso('Estoy escribiendo esto a las 3:00 am;
alguien que lo finalice!', siempreFalso)
Resultado:
[25, 16, 9, 4, 1, 0]
Estoy escribiendo esto a las 3:00 am, alguien que lo finalice!
lugar.
Resultado:
Yum! Me encantan los pasteles de manzana, no?
Yum! Me encanta pasteles de cereza, no?
1 NO es un nmero par!
3 NO es un nmero par!
5 NO es un nmero par!
Resultado:
7526 digitos
25000 duplicaciones: 0.246768 segundos
contar hasta un millon: 0.90245 segundos
Tim Toady
Algo que trat de mostrarte, lo cual seguramente podrs probar
pronto, es el concepto de TMTOWTDI (pronunciado como "Tim
Toady" en ingls for There's More Than One Way To Do It): Hay
Ms De Una Forma DE Hacer Esto.
Algunos te dirn que TMTOWTDI es maravillos mientras otros
puedan pensar algo diferente. No tengo fuertes sentimientos de
lascosas en general, pero pienso que esto es una terrible forma
de ensear a programar a alguin. (Como si aprender a
programar de una forma no fuera suficiente desafo y confuso!)
Sin embargo, ahora que te ests moviendose ms all de este
tutorial, vers mucha ms diversidad de cdigo. Por ejemplo,
pienso que al menos hay otras cinco formas de hacer un texto
(aparte de las que encierran un texto en comillas), y cada uno
de estos trabaja un poco diferente. Solo mostre lo ms simple.
Cuando hablamos de ramificacin, mostr el if, pero no mostr
el unless. Voy a dejar que te des cuenta por ti mismo en irb de
que se trata.
Otro lindo atajo que puedes usar con if, unless y while, es esta
linda versin de una lnea:
Cdigo:
# Estas lineas son de un programa que escribi para generar palabras
puts 'grobably combergearl kitatently thememberate' if 5 == 2**2 +
1**1
puts 'enlestrationshifter supposine follutify blace' unless 'Chris'.length
== 5
Resultado:
grobably combergearl kitatently thememberate
Resultado:
...haces esto:
Cdigo:
def hacerDosVeces
yield
yield
end
hacerDosVeces do
puts 'buritiate mustripe lablic acticise'
end
Resultado:
Fin
Usa esto para lo bueno y no para lo malo. :-) Y si encuentras
este tutorial til (o confuso, o si encuentras un error), avsanos!