Tutorial Ruby Peru

103
 N ú m eros A h ora q u e tie n e s to d o instalado , ¡vam o s ae sc ribir un p ro g r a m a ! A b re tu e d itor de t e x to f a vo ri t o y e scribe lo si g u i e nt e : puts 1+2 G u a r d a t u p ro g r am a ( , ¡ e so e s un p r o g ra m a! ) com ocalc.rb ( el .rb  es l o q ueusual m ent e p on em os al na l delos pr o gramas e scr i t o s e n R u b y) . A h ora e j ecuta t u p r o g r a ma escri b i e n doruby calc.rb e n la lí n e a d e com a n d o s. D e b erí a s ob t en e r u n3 e n t u p a n t a lla. ¿ L o ve s ? , p ro g ra m a r no es t an difí c il, ¿ c ier t o ? Intr o d u c c i ó na puts ¿C óm o e s que funciona ese progr am a? S egur am ent e p uedes a d ivinar q u é es lo q ue 1+2 ha ce ; n u e str o p r og ra m a es si cam ente lo m i sm o qu e: puts 3 puts si m p le m e n te e scri b e en la p a n t a lla lo q u e se a q ue e scr i b a m os a co n tin u a ció n . E n t er o s y o ta n te s E n la mayoría de los l e ngua j e s de p r o g r a m a ci ó n (y R u by no e s la exce p ción ) los n ú m e r o s sin d e cimal e s son lla m a d o se n tero s  (traducci ó n d e i n t e g e r s  e n su ve rsi ó n e n I n g l é s), y l o s n ú m e r o s

description

Tutorial Ruby On Rails Peru

Transcript of Tutorial Ruby Peru

NmerosAhora que tienes todo instalado, vamos a escribir un programa! Abre tu editor de texto favorito y escribe lo siguiente:puts 1+2Guarda tu programa (s, eso es un programa!) como calc.rb (el .rb es lo que usualmente ponemos al final de los programas escritos en Ruby). Ahora ejecuta tu programa escribiendo ruby calc.rb en la lnea de comandos. Deberas obtener un 3 en tu pantalla. Lo ves?, programar no es tan difcil, cierto?

Introduccin a putsCmo es que funciona ese programa? Seguramente puedes adivinar qu es lo que 1+2 hace; nuestro programa es bsicamente lo mismo que:puts 3puts simplemente escribe en la pantalla lo que sea que escribamos a continuacin.

Enteros y flotantesEn 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 con punto decimal normalmente son llamados nmeros de punto flotante (o llamados slo flotantes de ahora en adelante ya que proviene de su original en ingls floats).Aqu hay algunos enteros:5-20599999999999999999999999990Y aqu hay algunos flotantes:54.3210.001-205.38840.0En la prctica, la mayora de los programas no usan flotantes, slo enteros. (Despus de todo, nadie quiere leer 7.4 emails, o navegar 1.8 pginas, o escuchar 5.24 de sus canciones favoritas...) Los flotantes se usan ms con propsitos acadmicos (como por ejemplo experimentos cientficos) y para grficos en 3D. Incluso la mayora de los programas financieros usan enteros, simplemente llevan un registro de los centavos!

Aritmtica simpleHasta 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 un poco nuestro programa calc.rb. Escribe lo siguiente y ejectalo:puts 1.0 + 2.0puts 2.0 * 3.0puts 5.0 - 8.0puts 9.0 / 2.0Esto es lo que retorna el programa:3.06.0-3.04.5(Los espacios en el programa no son importantes; simplemente hacen que el cdigo sea ms fcil de leer). Bueno, eso no fue muy sorprendente. Ahora probemos con enteros:puts 1+2puts 2*3puts 5-8puts 9/2Bsicamente lo mismo, no?36-34Uh... excepto por el ltimo! Pero cuando se hace aritmtica con enteros, se obtienen enteros. Cuando tu computadora no puede obtener la respuesta "correcta", siempre redondea hacia abajo (Por supuesto, 4 es la respuesta correcta en aritmtica con enteros para 9/2; simplemente tal vez no sea el resultado que esperaba).Tal vez te preguntes para qu es til la divisin entera. Bueno, digamos que va al cine, pero slo tiene $9. Aqu en Portland, puede ver una pelcula en el Bagdad por $2. Cuntas pelculas puede ver all? 9/2... 4 pelculas. 4.5 definitivamente no es la respuesta correcta ya que no le dejarn ver la mitad de 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) + -15puts 98 + (59872 / (13*8)) * -52Resultado:5-29802

Algunas cosas por intentarEscribe un programa que te diga: cuntas horas hay en un ao? cuntos minutos hay en una dcada?? cuntos segundos de edad tiene usted? cuntos chocolates espera comer en su vida? Advertencia: Esta parte del programa puede tomar tiempo para computarse!Aqu hay una pregunta ms difcil: Si tengo 1031 millones de segundos de edad, cuntos aos tengo?Cuando termine de jugar con nmeros, echemos un vistazo a algunos textos.

TextosAs 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.'' '''Como puedes ver, los textos pueden tener puntuacin, dgitos, smbolos, y espacios dentro... ms que solo palabras. Ese ltimo texto no tiene nada y podemos llamarlo un texto vaco.Hemos estado usando puts para imprimir nmeros, intentmoslo con textos:Cdigo:puts 'Hola, mundo!'puts ''puts 'Adis.'Resultado:Hola Mundo

AdisEso funcion bien. Ahora intntalo con algn texto tuyo.

Aritmtica de textosIgual 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 manzanaWhoops! Me olvid de poner un espacio entre 'Me gusta' y 'el pastel de manzana.'. Los espacios no importan generalmente salvo si lo hacen dentro de los textos. (Es verdad lo que dicen: las computadoras no hacen lo que t quieres que hagan, solo lo que t le dices que hagan) Intentmoslo nuevamente:Cdigo:puts 'Me gusta ' + 'el pastel de manzana.'puts 'Me gusta' + ' el pastel de manzana.'Resultado:Me gusta el pastel de manzanaMe gusta el pastel de manzana(Como puedes ver, no import a que texto le agregu el espacio)As que puedes sumar textos, pero tambin puedes multiplicarlas! (Por un nmero ...) Observa esto:Cdigo:puts 'parpadeo ' * 4Resultado:batea tus prpados(Solo bromeaba, en realidad muestra esto):parpadeo parpadeo parpadeo parpadeoSi lo piensas, tiene todo el sentido. Despus de todo, 7*3 realmente solo significa 7+7+7, as que 'moo'*3 solo significa 'moo'+'moo'+'moo'.

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 + 12puts '12' + '12'puts '12 + 12'Resultado:24121212 + 12Y qu sucede con esto?:Cdigo:puts 2 * 5puts '2' * 5puts '2 * 5'Resultado:10222222 * 5Estos ejemplos fueron bastante directos. De cualquier modo, si no tienes cuidado en cmo mezclas tus textos y tus nmeros podras encontrarte con...

ProblemasEn este punto podras haber probado algunas cosas que no funcionaron. Si no lo has hecho, aqu hay algunas:Cdigo:puts '12' + 12puts '2' * '5'Resultado:can't convert Fixnum into String (TypeError)Hmmm... un mensaje de error. El problema es que en realidad no puedes sumar un nmero a un texto, o multiplicar un texto por otro texto. No tiene ms sentido que esto:puts 'Betty' + 12puts 'Fred' * 'John'Algo ms para tener cuidado: Puedes escribir 'pig'*5 en un programa, dado que slo significa 5 veces el texto 'pig' todo sumado. De cualquier modo, t no puedes escribir 5*'pig', ya que eso significa 'pig' veces el nmero 5, lo cual es simplemente tonto.Finalmente, y si quisieras que tu programa imprimiera Mi nombre es O'hara!? Podras intentar:puts 'Mi nombre es O'hara!'Bueno, eso no funcionar; No intentar ni ejecutarlo. La computadora pens que habamos terminado con el texto. (Esta es la razn de porque es lindo tener un editor de texto que haga coloreo sintctico por ti) Entonces, cmo permitimos que la computadora sepa que queremos permanecer en el texto? Tenemos que escapar el apstrofe, de esta manera:puts 'Mi nombre es O\'hara!'La barra invertida es el carcter de escape. En otras palabras, si t tienes una barra invertida y otro carcter, ellos a veces son convertidos a otro carcter. Las nicas cosas que una barra invertida escapa son los apstrofes y las propias barras invertidas. (Si lo piensas un poco, los caracteres escapados siempre se escapan a s mismo) Unos pocos ejemplos vendran muy bien, me parece:Cdigo:puts 'Mi nombre es O\'hara!'puts 'barra invertida al final del texto: \\'puts 'arriba\\abajo'puts 'arriba\abajo'Resultado:Mi nombre es O'hara!barra invertida al final del texto: \arriba\abajoarriba\abajoDado que la barra invertida no escapa un `'d', pero si si se escapa a si misma, esos dos ltimos caracteres son idnticos. No parecen lo mismo en el cdigo, pero en tu computadora son realmente los mismos.Si tienes alguna pregunta, solo sigue leyendo! No podra contestar cada pregunta en esta pgina, despus de todo.

VariablesHasta 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:...puedes decir eso de nuevo......puedes decir eso de nuevo...Sera bueno si pudiesemos escribirlo solo una vez y quedrnoslo... guardarlo en algn lado. Bueno, s podemos, por supuesto; de otra manera, no lo hubiese mencionado!Para guardar el texto en la memoria de tu computador, necesitamos darle un nombre al texto. Los programadores se refieren frecuentemente a este proceso como asignacin y llaman a los nombres variables. Esta variable puede ser cualquier secuencia de letras o nmeros, pero el primer caracter necesita ser minscula. Probemos nuestro programa de nuevo, pero esta vez voy a darle el nombre 'myString' al texto (aunque podra haber usado cualquier nombre, por ejemplo 'str' or 'myOwnLittleString' or 'henryTheEighth').Cdigo:myString = '...puedes decir eso de nuevo...'puts myStringputs myStringResultado:...puedes decir eso de nuevo......puedes decir eso de nuevo...En todo momento cuando haces referencia a 'myString', el programa usa en su reemplazo "'...puedes decir eso de nuevo...'". Puedes pensar en la variable 'myString' como "apuntando" al texto "'...puedes decir eso de nuevo...'". Este es un ejemplo un poco ms interesante.Cdigo:name = 'Patricia Rosanna Jessica Mildred Oppenheimer'puts 'Me llamo ' + name + '.'puts 'Wow! "' + name + '" es un nombre realmente largo!'Resultado:Me llamo Patricia Rosanna Jessica Mildred OppenheimerWow! Patricia Rosanna Jessica Mildred Oppenheimer es un nombre realmente largo!Tambin, as como podemos asignar un objeto a una variable, podemos reasignar un objeto diferente a esa variable (Por eso es que las llamamos variables: porque varan.)Cdigo:composer = 'Mozart'puts composer + ' fue "el amo", en su da.'

composer = 'Beethoven'puts 'Pero yo prefiero a ' + composer + ', personalmente.'Resultado:Mozart fue "el amo", en su da.Pero yo prefiero a Beethoven, personalmente.Por supuesto, las variables pueden apuntar a cualquier tipo de objeto, no slo texto:Cdigo:var = 'solo otro ' + 'texto'puts var

var = 5 * (1+2)puts varResultado:solo otro texto15De hecho, las variables pueden apuntar a casi cualquier cosa... excepto otras variables. Pero qu pasa si lo intentamos?Cdigo:var1 = 8var2 = var1puts var1puts var2

puts ''

var1 = 'ocho'puts var1puts var2Resultado:88

ocho8Primero, cuando tratamos de apuntar var2 a var1 en realidad apuntamos a 8 (que es el valor al cual apuntaba var1). Luego cuando apuntamos var1 a 'ocho', el valor de var2 no cambia ya que en realidad no estaba apuntando a var1 sino a 8. Ahora que tenemos variables, nmeros y textos, vamos a ver como mezclarlos.

MezclandoHemos revisado distintos tipos de objetos (nmeros y textos) y hemos hecho que variables apunten a ellos; lo que queremos hacer despus es que funcionen todos juntos.Hemos visto que si queremos que un programa imprima 25, lo que sigue no funciona, porque no puedes sumar nmeros y texto:Cdigo:var1 = 2var2 = '5'

puts var1 + var2Resultado:in `+': String can't be coerced into Fixnum (TypeError)Parte del problema es que tu computadora no sabe si estabas tratando de obtener 7 (2 + 5) o si queras obtener '25' ('2' + '5').Antes de poderlos sumar, necesitamos alguna forma de conseguir la representacin textual (en 'letras') de var1, o la representacin numrica de var2.

ConversionesPara obtener la representacin en texto de un objeto, simplemente escribiendo .to_s despus de el objeto:Cdigo:var1 = 2var2 = '5'

puts var1.to_s + var2Resultado:25De la misma manera, to_i devuelve la versin numrica entera de un objeto y to_f devuelve la versin de punto flotante, o sea la que lleva decimales. Veamos que hacen estos tres mtodos (y lo que no hacen) un poco ms de cerca:Cdigo:var1 = 2var2 = '5'

puts var1.to_s + var2puts var1 + var2.to_iResultado:257Nota que, inclusive despus de que obtuvimos la versin en texto de var1 al llamar to_s, var1 siempre apunt a 2, y nunca a '2'. A menos que reasignes explcitamente var1 (lo que requiere de un signo =), apuntar a 2 durante la duracin del programa.Ahora probemos conversiones ms interesantes (y un poco raras):Cdigo:puts '15'.to_fputs '99.999'.to_fputs '99.999'.to_iputs '5 es mi numero favorito.'.to_iputs 'Quin pregunta acerca de 5 o lo que sea?'.to_iputs 'Tu mam hizo.'.to_fputs 'fibroso'.to_sputs 3.to_iResultado:15.099.99999500.0fibroso3sto probablemente te ha sorprendido un poco. El primero es bastante estndar, devolviendo 15.0. Despus de eso, convertimos el texto '99.999' a un nmero de punto flotante y a un entero. El primero hizo lo que esperbamos; el entero fue, como siempre, redondeado hacia abajo.Luego, tuvimos ejemplos de algunos textos... inusuales ... convertidos a nmeros to_i ignora lo primero que no entienda, y el resto del texto a partir de ah. As que lo primero va a ser convertido a 5, pero los otros, ya que comenzaban con letras, fueron ignorados completamente... as que la computadora simplemente elige usar cero.Finalmente, vimos que las ltimas dos conversiones no hacan nada, tal como esperbamos.Hay algo extrao en nuestro mtodo favorito... Mira esto:Cdigo:puts 20puts 20.to_sputs '20'Resultado:202020Por qu estas tres lneas retornan el mismo resultado? Bueno, las ltimas dos deberan, ya que 20.to_s es '20'. Pero, qu pasa con la primera, el entero 20? Para tal caso, qu significa escribir el entero 20? Cuando escribes 2 y luego 0 en un papel, estas escribiendo texto, no un entero. El entero 20 es el nmero de dedos que tengo; no es 2 seguido de un 0.Bueno, ah est el secreto de nuestro amigo puts. Antes de que puts trate de imprimir un objeto, usa to_s para obtener la versin en texto de ese objeto. De hecho, la s en puts significa string (que en espaol significa texto); puts realmente significa put string (que en espaol significa imprimir texto).Esto puede no parecer muy emocionante ahora, pero hay muchos, muchos objetos en Ruby (inclusive vas a aprender a crear tus propios objetos!), y es bueno saber que va a pasar cuando trates de ejecutar puts con un objeto bastante raro, como la foto de tu abuela, o un archivo de msica, etc. Pero eso vendr despus ...Mientras tanto, tenemos unos cuantos mtodos para ti, y ellos nos permiten escribir todo tipo de programas divertidos ...

Los Mtodos gets y chompSi puts significa put string, estoy seguro que puedes adivinar que significa gets, get string (recibir texto). Y as como puts siempre devuelve texto, gets slo funciona con texto. Y de dnde lo recibe?De ti! Bueno, de tu teclado, en realidad. Ya que tu teclado slo escribe texto, todo funciona bien. Lo que realmente pasa es que gets simplemente lee todo lo que tipeas hasta que presionas Enter. Intentmoslo:Cdigo:puts getsResultado:*Hay eco aqu?*Hay eco aqu?Por supuesto, lo que sea que escribas simplemente ser impreso en pantalla por ti. Ejectalo unas cuantas veces e intenta escribir cosas distintas.Ahora podemos escribir programas interactivos! En este caso, escribe tu nombre y te saludar:puts 'Hola, cul es tu nombre?'name = getsputs 'Tu nombre es ' + name + '? Es un nombre adorable!'puts 'Encantado de conocerte, ' + name + '. :)'Uhm! Acabo de ejecutarlo, escrib mi nombre y esto es lo que he obtenido:Hola, cul es tu nombre?*Chris*Tu nombre es Chris? Es un nombre adorable!Encantado de conocerte, Chris. :)Hmmm... parece que cuando escrib las letras C, h, r, i, s, y luego presion Enter, gets recibi todas las letras de mi nombre y el Enter! Afortunadamente, hay un mtodo para este tipo de cosas: chomp. sto elimina cualquier Enter al final del texto. Intentmoslo de nuevo, pero con chomp para que nos ayude:Cdigo:puts 'Hola, cul es tu nombre?'name = gets.chompputs 'Tu nombre es ' + name + '? Es un nombre adorable!'puts 'Encantado de conocerte, ' + name + '. :)'Resultado:Hola, cul es tu nombre?ChrisTu nombre es Chris? Es un nombre adorable!Encantado de conocerte, Chris. :)Mucho mejor! Nota que ya que name apunta a gets.chomp, no tenemos que usar name.chomp; name ya fue procesado por `chomp.

Algunas cosas por intentar Escribe un programa que pregunte por el nombre de una persona, luego el segundo nombre y luego el apellido. Finalmente, debera saludar a la persona con el nombre completo. Escribe un programa que pregunte por el nmero favorito del usuario. Haz que tu programa agregue un nmero, luego sugiera el resultado como el nmero favorito pero ms grande y mejorado (Pero hazlo con tacto).Una vez que hayas terminado los dos programas (y otros que hayas intentado), tratemos de aprender ms (y ms sobre) mtodos!.

Ms acerca de MtodosHemos 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.Pero realmente, esto es lo que son: cosas que generan otras. Si objetos (como textos, enteros y flotantes) son los sujetos en el lenguaje Ruby, entonces los mtodos son como verbos. Y, justo como en el espaol, t no puedes tener un verbo sin un sustantivo para hacer algo. Por ejemplo, tic-tac no es algo que slo ocurre; un reloj (o algo) tiene que hacer esto. En espaol podemos decir: "El reloj hace tic-tac". En Ruby podemos decir clock.tick (asumiendo por supuesto que clock es un objeto Ruby). Los programadores pueden decir que estamos "llamando el mtodo tick de clock" o llamamos al "tick de clock".Entonces, has hecho la prueba? Bien. Bueno, estoy seguro que recordaras los mtodos puts, gets, y chomp, dado que ya hablamos sobre ellos. Probablemente tambin recuerdas los mtodos de conversin to_i, to_f, y to_s. Sin embargo, has visto los otros cuatro? Porque, estos no son otros que nuestros viejos amigos para la aritmtica +, -, *, y /!Entonces, como cada verbo necesita un sustantivo, entonces cada mtodo necesita un objeto. Esto es generalmente fcil de indicar: es el que viene justo antes de un punto, como nuestro ejemplo clock.tick, o en 101.to_s. Algunas veces, sin embargo, esto no es tan obvio; como con los mtodos aritmticos. Como resulta, 5 + 5 es solo otra forma fcil de escribir 5.+ 5. Por ejemplo:Cdigo:puts 'hola '.+ 'mundo'puts (10.* 9).+ 9Resultado:hola mundo99Esto no es muy lindo, por lo que no vamos a escribir siempre como ahora; sin embargo, es importante para entender que sucede realmente.Esto tambin nos da un profundo entendimiento de porque podemos hacer 'pig'*5 pero no podemos hacer 5*'pig': 'pig'*5 est diciendo a 'pig' de hacer de multiplicando, pero 5*'pig' est diciendo a 5 de hacer de multiplicando. 'pig' sabe como hacer 5 copias de si mismo y agregar todos ellos juntos; sin embargo, 5 tendr mucha mas dificultad en tiempo de hacer 'pig' copias de si mismo y sumarlos a todos juntos.Y, por supuesto, continuaremos teniendo puts y gets para explicar. Dnde estn sus objetos? En espaol, puedes algunas veces dejar fuera el sustantivo; por ejemplo, si un villano grita "Muere!", el sustantivo implcito es a quien l est gritando. En Ruby, si digo puts 'ser o no ser', lo que realmente estoy diciendo es self.puts 'ser o no ser'.Entonces que es self? sta es una variable especial que apunta al objeto en el que ests. No siempre sabemos como estar en un objeto, pero hasta que nos demos cuenta, siempre iremos a estar en un gran objeto que es... el programa entero! (sin embargo en este caso no es posible llamarlo en forma explcita) Observa lo siguiente:Cdigo:NoPuedoCreerQueUnaVariableConNombreTanLargoApunteA3 = 3puts NoPuedoCreerQueUnaVariableConNombreTanLargoApunteA3self.puts NoPuedoCreerQueUnaVariableConNombreTanLargoApunteA3Resultado:3in `': private method `puts' called for main:Object (NoMethodError)Si no alcanzaste a comprender todo, est bien. Lo importante es que todo mtodo est siendo propiedad de un objeto, incluso si no tiene un punto enfrente de este. Si entiendes esto ests preparado.

Mtodos imaginativos acerca de StringsVamos a aprender unos pocos pero interesantes mtodos. No tienes porque memorizar todos; puedes mirar esta pagina de nuevo si te olvidas de alguno. Yo slo quiero mostrarte una pequea parte de lo que puede hacer un texto. De hecho, no recuerdo ni siquiera la mitad de los mtodos para textos; pero est bien, porque hay buenas referencias en internet con todo acerca de textos listados y explicados (Voy a mostrarte donde encontrar esas referencias al final del tutorial).Realmente, tampoco quiero saber todo acerca de los mtodos para textos; sino sera como tratar de conocer cada palabra en el diccionario. Puedo hablar espaol bien sin conocer cada una de las palabras del diccionario... y no es ese realmente el objetivo del diccionario? Entonces no tienes que conocer que hay en ste?Entonces, nuestro primer mtodo para texto es reverse, el cual nos da una version invertida de un texto:Cdigo:var1 = 'parar'var2 = 'subrayado'var3 = 'Puedes pronunciar esta oracin al reves?'

puts var1.reverseputs var2.reverseputs var3.reverseputs var1puts var2puts var3Resultado:rarapodayarbus?sever la nicaro atse raicnunorp sedeuPpararsubrayadoPuedes pronunciar esta oracin al reves?Como puedes ver, reverse no revierte el orden en el string original; ste slo hace una nueva versin de ste en reversa. Esto es porque var1 continua 'parar' an despus de que llamamos reverse sobre var1.Otro mtodo para texto es length, el cual nos dice el nmero de caracteres (incluyendo caracteres) en el texto:Cdigo:puts 'Cul es tu nombre completo?'name = gets.chompputs 'Sabes que hay ' + name.length + ' caracteres en tu nombre, ' + name + '?'Resultado:Cul es tu nombre completo?Christopher David Pine# text 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.alimentarmascota.lanzarmascota.caminarmascota.dormirmascota.acunarmascota.dormirmascota.dormirmascota.dormirmascota.dormirResultado: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......pero despierta cuando te detienes.Colocas a Norbert en la cama.Se despierta de repente!El estomago de Norbertretumba...Colocas a Norbert en la cama.Se despierta de repente!El estomago de Norbertretumba...Colocas a Norbert en la cama.Se despierta de repente!El estomago de Norbertretumba...Norbert hace la danza del bao...Colocas a Norbert en la cama.Se despierta de repente!Norbert esta hambriento! En su desesperacion, te COMIO!Ouau! Por supuesto, sera mejor si fuese un programa interactivo, pero puedes modificarlo. Yo slo estaba tratando de mostrarte las partes relacionadas directamente con la creacin de una nueva clase de dragn.Vimos algunas cosas nuevas en ese ejemplo. La primera es simple: exit termina el programa en ese mismo momento. La segunda es la palabra private, que pusimos en la definicin de nuestra clase. Podra haberlos mantenido afuera, pero yo quera reforzar la idea de que hay ciertos mtodos que hacen cosas que puede hacer un dragn y otros que simplemente se establecen dentro el dragn. Usted puede pensar en ellos como "bajo el cap": a menos que seas un mecnico de automviles todo lo que necesitas saber es el pedal del acelerador, el pedal del freno y el volante. Un programador puede llamar a esto interfaz pblica del automvil. Sin embargo, cmo saber cuando la bolsa de aire se activar es algo interno del automvil, el usuario tpico (el conductor) no tiene por qu saberlo.En realidad, para un ejemplo ms concreto en ese sentido vamos a hablar sobre cmo se podra representar un coche en un videojuego (que pasa a ser mi lnea de trabajo). En primer lugar, tienes que decidir como deseas que tu interfaz pblica se parezca, es decir, los mtodos de la gente debera ser capaz de llamar por cada uno de los objetos de su coche. Bueno, tienes que ser capaz de empujar el pedal del acelerador y el pedal de freno, pero que tambin tienes que ser capaz de especificar lo fuerte que ests empujando el pedal. (Hay una gran diferencia entre pisar y golpear) Tambin tendras que ser capaz de dirigir el timn, y otra vez, tendras que ser capaz de decir lo mucho que ests moviendo la rueda del timn. Supongo que se podra ir ms all y aadir un embrague, direccionales, lanzacohetes, cmara de post-combustin, condensador de flujo, etc .. depende del tipo de juego que ests haciendo.Internamente al objeto coche, sin embargo, tendramos que hacer mucho ms cosas; otras cosas que necesita un coche son una velocidad, una direccin y una posicin (que son las cosas ms bsicas). Estos atributos se modificaran pulsando sobre el gas o los pedales de freno y girando la rueda, pero el usuario no sera capaz de establecer la posicin directamente (que sera como una deformacin). Usted tambin podra patinar o daar si se ha volcado y as sucesivamente. Todo esto sera interno a su objeto coche.

Algunas cosas por intentar Hacer una clase arbolNaranja. Deber tener un mtodo altura que devuelve su altura y un mtodo paso365Dias que cuando se le llama aumenta la edad del rbol en un ao. Cada ao crece el rbol ms alto (mucho ms de lo que piensas que un naranjo debe crecer en un ao), y despus de un cierto nmero de aos (de nuevo, tu llamada) el rbol debe morir. En los primeros aos el rbol no debe producir fruta, pero despus de un tiempo debera hacerlo, y supongo que los rboles ms viejos producen ms cada ao que los rboles ms jvenes ... lo que pienses que tiene ms sentido. Y, por supuesto, t debers ser capaz de contarNaranjas (que devuelve el nmero de naranjas en el rbol), y tomarUnaNaranja (que reduce la @numeroNaranjasen uno y devuelve un texto que te dice cmo la naranja era deliciosa, o de lo contrario slo te dice que no hay naranjas ms para elegir este ao) Asegrate que las naranjas que no se recogen en un ao se caen antes del prximo ao. Escribir un programa para que pueda interactuar con tu beb dragn. Debers ser capaz de introducir comandos como alimentar y caminar, y hacer que esos mtodos se llamen en tu dragn. Por supuesto, ya que lo que ests ingresando son slo textos, tendrs que tener algn tipo de mtodo de envo, donde el programa revise los textos que se han ingresado y luego llama al mtodo adecuado.Y eso es casi todo lo que hay que hacer! Pero espera un segundo ... Yo no he hablado de ninguna de esas clases para hacer cosas como enviar un correo electrnico o guardar y cargar archivos en el computador, o cmo crear ventanas y botones, o los mundos en 3D, ni nada! Bueno, hay tantas clases que pueden utilizar que no es posible mostrar a todos, yo no conozco la mayora de ellos! Lo que puedo decir es que para saber ms sobre ellos tienen que saber acerca de los que deseas que el programa haga. Antes de terminar hay una caracterstica ms de Ruby que debers conocer, algo que la mayora de lenguajes de programacin no tiene pero sin las cuales simplemente no podra vivir: bloques y procedimientos.

Bloques y ProcedimientosEsta 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.calltoast.calltoast.callResultado:Aplausos!Aplausos!Aplausos!Entonces cre un proc (el cual pienso debera ser pronunciado como "procedimiento") que contiene un bloque de cdigo, y llam (called) el proc tres veces. Como puedes ver, esto es 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:Me gusta *realmente* el chocolate!Me gusta *realmente* el ruby!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)

Mtodos que reciben ProcedimientosCuando pasamos un proc en un mtodo podemos controlar cmo o cuntas veces llamamos el proc. Por ejemplo, vamos a decir que queremos hacer antes y despus de cierto cdigo que se esta ejecutando:Cdigo:def hacerAlgoImportante unProc puts 'Todo el mundo DETENGANSE! Tengo algo que hacer...' unProc.call puts 'A todos: Est hecho. Continuen con lo que estaban haciendo.'end

decirHola = Proc.new do puts 'hola'end

decirAdios = Proc.new do puts 'adios'end

hacerAlgoImportante decirHolahacerAlgoImportante decirAdiosResultado:Todo el mundo DETENGANSE! Tengo algo que hacer...holaA todos: Est hecho. Continuen con lo que estaban haciendo.'Todo el mundo DETENGANSE! Tengo algo que hacer...adiosA todos: Est hecho. Continuen con lo que estaban haciendo.'Quiz esto no parezca muy fabuloso... pero lo es. :-) Es comn en programacion tener requerimientos estrictos acerca de que debe ser hecho y cuando. Si quieres salvar un archivo, por ejemplo, tienes que abrir el archivo, escribir la informacion que quieres que contenga y luego cerrar el archivo. El olvido de cerrar el archivo puede traer malas consecuencias. Pero cada vez que quieras salvar un archivo o cargar uno tienes que hacer lo mismo: abrir el archivo, hacer lo que realmente quieres hacer y luego cerrar el archivo. Esto es tedioso y fcil de olvidar. En Ruby, guardar (o cargar) archivos trabaja en forma similar al cdigo anterior, entonces no tienes que preocuparte por nada ms que por lo que quieres guardar(o cargar). (En el prximo capitulo mostrar donde encontrar informacin sobre guardar y cargar archivos.)Tambin puedes escribir mtodos que determinan cuantas veces, o incluso si deben llamar a un proc. Aqu hay un mtodo el cual podra llamar al proc la mitad de veces y otro el cual lo llamar el doble de veces:Cdigo:def puedeHacerse unProc if rand(2) == 0 unProc.call endend

def hacerDosVeces unProc unProc.call unProc.callend

parpadeo = Proc.new do puts ''end

mirada = Proc.new do puts ''end

puedeHacerse parpadeopuedeHacerse miradahacerDosVeces parpadeohacerDosVeces miradaResultado:

(Si ejecutas el programa un par de veces, vers que la salida cambiar) Estos son algunos de los casos comunes de uso de procs lo que le permite hacer cosas, utilizando simplemente mtodos no podriamos hacerlo. Seguramente, podras escribir un mtodo para que parpadee dos veces, pero no podras escribir uno que haga algo dos veces!Antes de continuar, vamos a ver un ltimo ejemplo. Los procs que hemos visto son bastante similares. Es tiempo de ver algo diferente, entonces vamos a ver cuanto un mtodo depende de un proc pasado a este. Nuestro mtodo tomar algun objeto y un proc, y llamar a este proc sobre este objeto. Si el proc retorna falso, terminamos; en caso contrario llamaremos al proc con el objeto. Continuaremos haciendo esto hasta que el proc retorne falso (esto es mejor, o el programa finalizar con error). El mtodo retornar el ltimo valor no falso retornado por el proc.Cdigo:def hacerHastaQueSeaFalso primeraentrada, unProc entrada = primeraentrada salida = primeraentrada

while salida entrada = salida salida = unProc.call entrada end

entradaend

construirMatrizDeCuadrados = Proc.new do |array| ultimonumero = array.last if ultimonumero