ruby en mp3

Upload: hector-daniel-jacales

Post on 18-Oct-2015

63 views

Category:

Documents


0 download

DESCRIPTION

Ruby Apuntes

TRANSCRIPT

  • Todo lo que siempre quisiste saber sobre Ruby y no te vamos a contar

    William Viana Andreu Belmonte

    13 de noviembre

  • Contenidos

    1 Introduccin 4

    2 puts "Ruby mola mazo!" 5

    2.1 Invocando el intrprete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

    2.2 Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

    2.3 Tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

    2.3.1 Nmeros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

    2.3.2 Cadenas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

    2.3.3 Smbolos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

    2.3.4 Rangos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

    2.3.5 Expresiones regulares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

    2.3.6 Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

    2.3.7 Hashes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

    3 Condicionando y repitiendo 14

    3.1 Expresiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

    3.1.1 if y unless . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

    3.1.2 case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

    3.2 Bucles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

    1

  • William Viana y Andreu Belmonte 2

    3.2.1 while y until . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

    3.2.2 for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

    4 New kids on the block 19

    4.1 Mtodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

    4.1.1 Cmo hacer bien un finger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

    4.2 Bloques e iteradores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

    4.2.1 Qu echan en el cine? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

    5 Un lenguaje con clase 27

    5.1 Clases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

    5.1.1 Acceso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

    5.1.2 Herencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

    5.2 Mdulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

    5.3 Mixins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

    6 Si no lo apunto se me olvida 34

    6.1 La clase File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

    6.2 Bienvenido al mundo falible . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

    6.3 Qu voy a ver en el cine? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

    7 Qt4-Ruby 377.1 Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

    7.2 Estructura de un interfaz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

    7.2.1 SignalnSlots: Connecting Peoples objects . . . . . . . . . . . . . . . . . . . . . . . . . . 39

  • William Viana y Andreu Belmonte 3

    7.3 Diseo del interfaz: Designer-qt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

    7.4 Implementacin de la funcionalidad del interfaz . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

    7.5 Aplicacin principal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

    8 Dice la leyenda que se empieza por documentar y se acaba por implementar 46

    8.1 Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

    8.2 SimpleMarkup o yo solo s HTML, como se juega a esto? . . . . . . . . . . . . . . . . . . . . . . 47

    8.3 y ahora?. . . ejecucin sobre nuestro cdigo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

    9 Material relacionado 51

    10 Agradecimientos 52

    11 Sobre este documento 53

  • 1 Introduccin

    Ruby es un lenguaje de programacin orientado a objetos puro. Se basa sobretodo en la sintaxis de Perl y enla orientacin a objetos de SmallTalk. Fue creado por el japons Yukihiro Matz Matsumoto quien lo liber alpblico en 1995. Es distribuido bajo dos licencias: una propia y la GPL.

    Ruby es un lenguaje interpretado y no es de los ms rpidos. Matz lo que quera hacer era un lenguaje divertidode programar, en el que el programador pudiera ser muy productivo en poco tiempo. A m al menos divertidome resulta :)

    Sobre las versiones, la ltima versin estable es la 1.8.4 y la que est en desarrollo es la rama 1.9 que ser lafutura versin 2.0

    En este manual/tutorial aprenderemos lo bsico del lenguaje para empezar a programar scripts sencillos. Apren-der a hablarlo fluidamente ser cosa tuya. Talvez para la compresin de este manual haga falta ciertas nocionessobre programacin orientada a objetos, as que si no las tienes haz los deberes y al menos busca informacin enla wikipedia sobre el tema.

    4

  • 2 puts "Ruby mola mazo!"

    2.1 Invocando el intrprete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62.2 Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62.3 Tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

    2.3.1 Nmeros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72.3.2 Cadenas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82.3.3 Smbolos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92.3.4 Rangos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92.3.5 Expresiones regulares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102.3.6 Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122.3.7 Hashes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

    5

  • William Viana y Andreu Belmonte 6

    Todo lenguaje de programacin se empieza a aprender con un programa que imprime en pantalla "Hola mundo!".Nosotros seremos un poco ms originales, pero no demasiado, y aprenderemos a imprimir en pantalla "Ruby molamazo!". De hecho eso es lo que justamente hace el ttulo del captulo.

    Sigamos con algo un poco ms serio.

    2.1 Invocando el intrpreteLos ficheros de cdigo fuente de Ruby llevan la extensin .rb y el intrprete se llama ruby. Nuestro primerHay varias maneras de invocar el intrprete

    pasndole argumentos en la lnea de coman-dos. Por ejemplo con el parmetro -e pode-mos ejecutar cdigo desde la misma lnea decomandos:

    ruby -e puts "Hola mundo!"Con -c simplemente se comprueba la sintaxisdel cdigo y con -w se activan los warnings.Para ver una lista con todas las opcionesdisponibles:

    man ruby

    programa tendr este aspecto:

    hola_mundo.rb#!/ usr / b in /env rubyputs "Ruby mola mazo ! " # es to es un comentario .

    La primera lnea indica, en un sistema Unix, con qu intrprete se ha de interpretar ese fichero. Para ejecutarnuestro programa desde la lnea de comandos podemos hacerlo as:

    ruby hola_mundo.rb

    o si el fichero tiene permisos de ejecucin simplemente:

    ./hola_mundo.rb

    Tambin podemos usar el intrprete interactivo de Ruby que se llama irb.i rb> puts "Ruby mola mazo ! "Ruby mola mazo !=> n i l

    2.2 VariablesLas variables en Ruby no necesitan declararse y no tienen tipo, puedes almacenar en ellas lo que sea. LasEn realidad lo que se almacenan en las vari-

    ables son referencias, no un valor. Esto puedecausar algn dolor de cabeza si no se tiene encuenta.

    constantes deben empezar con una letra mayscula y si intentas cambiar el valor de una constante durante laejecucin Ruby te lanzar un warning. Las variables globales empiezan con un smbolo del dlar y las constantesglobales con un dlar seguido de una letra mayscula. Algunos ejemplos de nombres de variables:

    foo bar Pi $IVA $Precio

  • William Viana y Andreu Belmonte 7

    Resta saber qu tipo de datos se pueden almacenar en una variable, sigue leyendo.

    2.3 Tipos2.3.1 Nmeros

    Al principio he dicho que Ruby era un lenguaje orientado a objetos y ahora lo empezaremos a notar. Todos lostipos base en Ruby son objetos. Los nmeros enteros pertenecen a la clase Fixnum si estn comprendidos entreun rango 230 y 230 y Bignum para cualquier nmero entero fuera de ese rango.

    Tambin se pueden utilizar diferentes bases de representacin (binaria, octal, hexadecimal,...) Los nmeros realespertenecen a la clase Float y tambin se pueden representar en notacin cientfica.

    El mtodomethods devuelve una lista con to-dos los mtodos disponibles del objeto. Otramanera de averiguar qu metodos tiene unobjeto es ejecutar el interprete interactivo deruby con la opcin de autocompletado

    irb readline -rirb/completion

    escribir un valor o variable seguido de un puntoy darle al tabulador. Esto es vlido no slopara objetos de la clase Fixnum sino paracualquier objeto y es una buena manera deexplorar los mtodos disponibles de una clase.

    i rb> 0xFF #hexadecimal=> 255irb> 0b010 #binar i o=> 2irb> 020 #oc t a l=> 16irb> 0.000125=> 0.000125irb> 1.25 e5=> 1.25 e05irb> 1.25 e3=> 0.00125irb> 0.00125=> 0.00125

    Como todo objeto de una clase los nmeros tienen sus propios mtodos.

    i rb> 42 . c l a s s=> Fixnumirb> 3.abs #va l o r a b so l u t o=> 3irb> 4 . succ #sucesor de 4=> 5irb> 3 . 1415 . to_i=> 3

  • William Viana y Andreu Belmonte 8

    i rb> 5 . times{ p r i n t "JA" }JAJAJAJAJA=> 5

    La ltima lnea quizs sea la nica que merece una explicacin. Traducido del ingls y ledo en voz alta poneesto:

    5 veces imprime JA

    Muy legible, verdad? Casi se parece al lenguaje natural. Vayamos por partes: times es un iterador y lo que vaentre llaves es el bloque que se le pasa al iterador. Dont panic! Veremos ms sobre iteradores y bloques msadelante.

    2.3.2 Cadenas

    Una cadena es cualquier smbolo rodeado entre comillas dobles o simples.Las cadenas con comillas dobles permitenEl primer carcter de una cadena es el dendice 0. Adems se puede acceder a los car-acteres de una cadena en orden inverso uti-lizando nmeros negativos: el ltimo carcteres el -1, el penltimo el -2,...

    secuencias de escape, como \n o \t, y la potente expresin de evaluacin #{ }. Los operadores de sumay multiplicacin permiten concatenar y repetir cadenas. Ruby tiene adems el operador de adicin por elfinal puts " \tRuby mola #{mucho 3}mas que Python "Ruby mola mucho mucho mucho mas que Python

    => n i li rb> cad1 = " chunky "=> " chunky "i rb> cad1 += " bacon "=> " chunky bacon "i rb> cad1 " chunky bacon chunky bacon "i rb> cad1 [ 7 . . 1 1 ]=> " bacon "i rb> cad1 [ 0 . . 1 4 ] = " kevin "=> " kevin "i rb> cad1

  • William Viana y Andreu Belmonte 9

    =>" kevin bacon "

    Las cadenas pertenecen a la clase String y, cmo Ruby mola mucho, tienen un montn de mtodos molones queString, al igual que las otras clases de tiposbase de Ruby, tiene muchos mtodos y no va-mos a verlos todos aqu. Sus nombres sonbastante autoexplicativos, recomiendo que lospruebes en el intrprete interactivo. Conocer-los har que amples vocabulario y alcancescierta fluidez en el lenguaje.

    nos facilitan la vida. Y para muestra un botn:

    hola_fulanito.rb1 p r i n t " Introduce nombre y a p e l l i d o s : "2 nombre_completo = ge t s3 nombre_completo . strip !4 p r i n t " Hola "5 nombre_completo . each ( " " ) { | pa labra | p r i n t palabra . capitalize , " " }

    Para empezar vemos dos mtodos nuevos: print y gets. print es igual que puts pero no aade un salto de lneaal final y gets lee una cadena del teclado. El mtodo strip! remueve el \n del final de la cadena si lo hay. Losmtodos que terminan con un smbolo ! indican que el objeto va a ser modificado. Por ltimo, vuelve a aparecerun iterador y un bloque. Iteradores y bloques se usan mucho en Ruby y siempre los veremos cogidos de la mano.El iterador each sobre cadenas va tomando los valores de sus elementos. Por defecto considera que los elementosen una cadena estn separados por un \n, por eso le especificamos que tome como delimitador un espacio enblanco para que considere cada palabra como un elemento. Lo que va dentro de las barras verticales es la variableque interacta con el bloque; each le va pasando al bloque los valores que va tomando a travs de la variablepalabra

    2.3.3 Smbolos

    Los smbolos empiezan por el smbolo : y pueden contener letras, dgitos o barras bajas. Para Ruby los smbolosson ms fciles de procesar que las cadenas. Generalmente los usars cuando necesites una cadena pero nonecesites imprimirlo por pantalla, por ejemplo para pasarle un mensaje a un objeto.

    :soy_un_simbolo :rojo :mil :on :off

    2.3.4 Rangos

    Los rangos en Ruby tambin son un tipo. Se representan por dos valores entre parntesis separados por dos otres puntos.

    (1..5) representa los nmeros del 1 al 5

  • William Viana y Andreu Belmonte 10

    (a..z) representa las letras de la a a la z

    (1...5) representa los nmeros del 1 al 4

    El operador === sobre rangos sirve para comprobar si un valor est comprehendido en el rango, en casoafirmativo devuelve true y en caso contrario false. El rango ha de estar a la izquierda del operador:

    (1..10) === 5

    2.3.5 Expresiones regulares

    En Ruby la ausencia de valor se expresa conla constante nil. Si no se le asigna un valor auna variable se le asigna por defecto nil

    Cuando lo que buscas en una cadena es unapalabra es posible utilizar el operador [ ].Nuestra bsqueda de la palabra Ruby en lacadena se podra haber hecho as:

    texto["Ruby"]Esto devuelve la cadena Ruby si sta est pre-sente en la variable texto y nil en caso con-trario.

    Sobre las expresiones regulares se han escrito libros enteros y dominarlas es casi ms difcil que aprender Ruby(talvez lo sea), pero son tremendamente tiles y los rubistas lo utilizan bastante, as que le dedicaremos algo detiempo. En Ruby las expresiones regulares son un tipo base como las cadenas o los nmeros. Su utilidad es lade encontrar palabras o patrones en un texto o comprobar que algo cumple un patrn. Las expresiones regularesvan delimitadas por barras. La manera ms simple de utilizar una expresin regular para buscar una palabra enuna cadena sera la siguiente:

    texto.match(/Ruby/)

    El mtodo match compruebo si se cumplen las condiciones de la expresin regular, si se cumplen devuelve unobjeto de tipo MatchData, en caso contrario devuelve nil. En nuestro ejemplo match comprueba si en lacadena est presente la palabra Ruby.

    El operador =, sirve para el mismo propsito que match pero devuelve la posicin del principio de la coinci-dencia en caso de que se cumpla y nil en caso contrario. Adems, en caso de coincidencia, asigna a las variablesglobales $,$& y $ la parte de la cadena anterior a la coincidencia, la parte de la cadena coincidente y la partede la cadena posterior respectivamente.

    i rb> " Programar en Ruby es d i v e r t i d o " =~ /Ruby/=> 13irb> puts "#{\$}#{\$ } "Programar en es d i v e r t i d o=> n i l

    Lo cierto es que siempre les he tenido manaa las expresiones regulares pero Ruby me hahecho que me reconcilie con ellas. An as,an me cuesta utilizarlas

    Las expresiones regulares disponen de algunos caracteres y combinaciones de caracteres con un significado espe-cial:

  • William Viana y Andreu Belmonte 11

    Smbolo Significado[a-z] Indica cualquier carcter entre la a y la z[ab] Indica o una a o una b\d Un dgito. Equivale a [0-9]\w Una letra, un dgito o una barra baja. Equivale a [A-Za-z0-9]\s Espacio en blanco [\t\r\n]\b Lmite de palabra\D cualquier cosa escepto dgitos. Equivale a [\d]\W es la negacin de \w\S es la negacin de \s\B es la negacin de \b. cualquier carcter

    {n} Exactamente n veces lo que precede{n,m} Al menos n y como mximo m de lo que precede{n,} n o ms de lo que precede* Cero o ms repeticiones de lo que precede+ Una o ms repeticiones de lo que precede? Cero o una repeticin de lo que precede() Agrupamiento La lnea empieza por lo que va a continuacin$ La lnea termina por lo que precedei Puesto despus de la ltima barra delimitadora hace que no se dis-

    tinga maysculas de minsculas

    Algunas expresiones regulares:

    /]+>/ i #una e t i q u e t a de aper tura o c i e r r e en l engua j e html/\d{8}[\ s ] ? [ az ] / i #un DNI/\d+:\d+/ #una hora con formato 00:00/ .+(\ . png ) $/ i #e l nombre de un arch ivo que termina en png/\/\ .\\// #un comentario en l engua j e C$

  • William Viana y Andreu Belmonte 12

    2.3.6 Arrays

    Los arrays son colecciones de valores agrupados alrededor de corchetes y separados por comas. Un array puedecontener valores de cualquier tipo y no necesariamente todos del mismo tipo. Como en la mayora de lenguajesde programacin, se puede acceder a un elemento usando un ndice dentro del operador [ ]. Los mtodos derepeticin, concatenacin y corte de las cadenas tambin sirven para los arrays. La diferencia importante conotros lenguajes de programacin es que si intentas acceder a un elemento que no est en el array no se produceun error de ndice fuera del rango sino que el array te devuelve el valor nil (ausencia de valor).

    i rb> cajon = [ " cds " , " l i b r e t a " , " b o l i g r a f o " , " l i b r o " , " c h i c l e pegado " ]=> [ " cds " , " l i b r e t a " , " b o l i g r a f o " , " l i b r o " , " c h i c l e pegado " ]i rb> cajon [ 4 ]=> " c h i c l e pegado "i rb> cajon [ 2 . . 4 ]=> [ " b o l i g r a f o " , " l i b r o " , " c h i c l e pegado " ]i rb> cajon [ 6 ]=> n i li rb> cajon [ 6 ] = " g a l l e t a "=> " g a l l e t a "i rb> cajon=> [ " cds " , " l i b r e t a " , " b o l i g r a f o " , " l i b r o " , " c h i c l e pegado " , n i l , " g a l l e t a " ]i rb> hab i tac i on = %w/ e s c r i t o r i o ordenador armario e s t a n t e r i a /=> [ " e s c r i t o r i o " , " ordenador " , " armario " , " e s t a n t e r i a " ]

    El elemento de ndice 8 no tena ningn valor asignado, pero luego decido asignarle el valor galleta. Del ndice6 no he dicho nada pero Ruby ha puesto ah un nil, en realidad es como si siempre hubieran estado ah pero antesno lo veamos. La ltima lnea es otra forma de inicializar un array de cadenas sin tener que estar escribiendolas comillas y las comas, muy cmodo.

    hola_fulanito2.rb1 p r i n t " Introduce nombre y a p e l l i d o s : "2 nombre_completo = ge t s . strip3 nombres = nombre_completo . s p l i t4 nombres . each { | nombre | nombre . capital ize ! }5 nombre_completo = nombres . join ( " " )6 puts " Hola #{nombre_completo } ! "

  • William Viana y Andreu Belmonte 13

    $ ruby ho la_fu lan i to2 . rbIntroduce nombre y a p e l l i d o s : senyor sombreroHola Senyor Sombrero !$

    Ya s que es un ejemplo muy estpido pero slo quera que vieras como convertir cadenas en arrays, arrays encadenas y que los arrays tambin tienen el iterador each.

    2.3.7 Hashes

    Tambin llamados vectores asociativos o diccionarios, los hashes (los rubistas prefieren ese trmino) son comolos arrays pero no estn ordenados y se accede a los elementos mediante una clave. Por tanto los hashes son unacoleccin de pares clave, valor rodeados por llaves dnde clave y valor estn separados por los smbolos => ypueden ser de cualquier tipo. Por supuesto no pueden haber claves repetidas. Si se intenta acceder a una claveinexistente devuelve nil.

    1 i n f o = { " nombre "=>" Brau l io da S i l v a " ,2 " p r o f e s i o n "=>" Fotografo de p l a t o s combinados " ,3 " a sp i r a c i on "=>"Exponer en e l bar Reino lds "4 }56 i n f o . each { | c lave , va l o r | puts "#{c l ave . c a p i t a l i z e } : #{va lo r } " }

    Un ejemplo estpido ms. A estas alturas creo que ya no merece ninguna explicacin.

    Ya hemos visto un poco ms o menos todos los tipos base de Ruby pero con eso slo no podemos hacer mucho.Subamos un peldao ms.

  • 3 Condicionando y repitiendo

    3.1 Expresiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153.1.1 if y unless . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153.1.2 case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

    3.2 Bucles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173.2.1 while y until . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173.2.2 for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

    14

  • William Viana y Andreu Belmonte 15

    Bueno, me he dado cuenta de que quizs estoy tratando de explicarlo todo como si no supieras programar. Si nosabes programar te has equivocado de lugar. A partir de ahora vamos a ir un poco ms rpido (o no me dartiempo de terminar el documento).

    Este captulo va de bucles y sentencias de control. En Ruby las sentencias de control son un poco diferentes delos dems lenguajes y en seguida veremos por qu.

    3.1 Expresiones3.1.1 if y unless

    En Ruby todo lo susceptible de devolver un valor lo hace. Por eso if, que en otros lenguajes decimos que es unasentencia de control, en Ruby diremos que es una expresin ya que devuelve un valor. Y qu valor devuelve?Pues el valor de la ltima lnea que se ha evaluadoPuedes llamarle a if como te d la gana, me

    interesa que te acuerdes que devuelve un valor 1 dejar_pasar = i f l i s t a . i n c lude ? Brau l io then : s i else : no end2 i f dejar_pasar == : s i3 puts " Pase por aqui . "4 e l s i f Brau l io . o f rece_soborno ?5 puts " Pase por aqui caba l l e r o , y que tenga una agradable ve lada "6 else7 puts "No e s t a s en l a l i s t a , no ent ra s . "8 end

    Creo que queda bastante claro la sintaxis del if, pero lo dir de palabra. Si lo quieres hacer todo en la mismalnea tan horrible como he hecho yo en la lnea 1, has de incluir la palabra then despus de la condicin. Puedesanidar condiciones con elsif y aadir al final un else opcionalmente. Al final has de incluir la palabra end parafinalizar el bloque. La identacin es opcional.

    La primera lnea del ejemplo anterior es realmente horrible, no recomiendo que hagas nunca algo as. Ruby tienealgo que puede hacer de esa lnea mucho ms elegante: los modificadores if. Esa misma lnea se podra haberescrito as

    dejar_pasar = :si if lista.include? Braulio

    Esa asignacin se har slo si el pobre Braulio est en la dichosa lista. Si dejar_pasar no estaba inicializada yBraulio no estaba en la lista entonces, como toda variable no inicializada, se le asignar nil.

  • William Viana y Andreu Belmonte 16

    La expresin unless es la forma negada de if.

    if foo != 0 equivale a unless foo == 0

    Por ltimo hay que recalcar una diferencia importante entre Ruby y otros lenguajes:

    sorpresa.rb1 foo = 02 i f f oo3 puts " Seguro que no te esperabas que se imprimiera e s to "4 else5 puts "Y esperabas que se imprimiera e s to otro "6 end

    El nico caso en el que se ejecutara el bloque de cdigo del else sera cuando foo fuera igual a nil o a false.unless me parece un poco raro pero no spor qu lo uso bastante, supongo que por lanovedad. 3.1.2 case

    case es como el switch de C. Para quien no conoce el switch de C, es parecido a tener varios elsif anidados, perocon una sintaxis ms cmoda.Est genial eso de escribir un manual, uno

    puede poner lo que le d la gana con total lib-ertad. Os lo recomiendo. precio_musica.rb

    1 opin ion_persona l = case precio_de_un_cd2 when 0 . . . 53 " g en i a l "4 when 5 . . . 1 05 " razonab le "6 when 1 0 . . . 1 57 " e spero que tenga un l i b r i t o chulo "8 when 15 . . 2 09 "un poco caro , pero s i l l e v a dvd es aceptab l e "10 else11 "un abuso "12 end

    Se evala lo que va justo despus del case y se compara usando el operador ===. Al igual que con el if si quiereshacerlo todo en la misma lnea has de incluir la palabra then, sino puedes omitirla.

  • William Viana y Andreu Belmonte 17

    3.2 Bucles3.2.1 while y until

    El bucle while se ejecuta mientras se cumpla una condicin y until mientras no se cumpla. Al igual que if yunless, while y until se pueden usar como modificadores.

    newpass.rb1 opcion = 02 until opcion == 23 puts " 1 I n t r oduc i r nuevo password "4 puts " 2 S a l i r "5 opcion = 06 until ( 1 . . 2 ) === opcion7 p r i n t " Introduce opcion : "8 opcion = STDIN. ge t s . to_i9 end10 i f opcion == 111 pr i n t " Introduce nuevo password : "12 password = STDIN. ge t s . rstrip13 until password . match ( / ^ .{8 ,15} $/ )14 puts " El password ha de tener de 8 a 15 c a r a c t e r e s "15 p r i n t " Introduce nuevo password : "16 password = STDIN. ge t s . rstrip17 end18 puts " Password ac tua l i z ado "19 end20 end

    Bien, los ejemplos poco a poco los puedo hacer ms interesantes. Si has llegado hasta aqu creo que ya eres capazde entender ese trozo de cdigo sin que tenga que explicar nada (creo que incluso alguien que no hable Rubypuede entenderlo).

    3.2.2 for

    El bucle for itera sobre colecciones al igual que hace el iterador each. Tiene una sintaxis muy parecida a Python:

  • William Viana y Andreu Belmonte 18

    1 for elemento in i t e r a b l e2 . . .3 end

    iterable es cualquier cosa sobre la que se pueda iterar (un rango, un array, una cadena, un diccionario), de hechoRuby traduce eso a algo como:

    1 i t e r a b l e . each { | elemento | . . . }

  • 4 New kids on the block

    4.1 Mtodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204.1.1 Cmo hacer bien un finger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

    4.2 Bloques e iteradores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234.2.1 Qu echan en el cine? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

    19

  • William Viana y Andreu Belmonte 20

    Estaba deseando que llegara este momento. Es el momento de presentar (in)formalmente una de las cosas que msEl ttulo de ese captulo es una referencia algrupo del mismo nombre de los 80. Cuandoera pequeo mi hermana mayor me torturabacon su msica

    me gusta de Ruby: iteradores y bloques. En este captulo tambin veremos como definir mtodos. Empecemospor lo ms fcil.

    4.1 MtodosDefinir tus propios mtodos es bien fcil, veamos su sintaxis y alguna peculiaridad:

    metodos.rb1 def cuadrado (x )2 return xx3 end45 def t r i a n gu l o s6 " son ad i f e r e n t e s de l o s cuadrados "7 #se puede omi t i r l a pa labra re turn8 end910 def metodo (uno , dos , va r i o s )11 "Me han pasado #{uno} , #{dos } , #{va r i o s . j o i n ( , ) } "12 end1314 def es_palindromo ?( f r a s e )15 f r a s e = f r a s e . dup #hago una copia de f r a s e16 f r a s e . gsub ! ( " " , " " ) . downcase ! == f r a s e . r e v e r s e17 end1819 puts " Cuadrado de 2 = #{cuadrado 2} "20 puts " Los t r i a n gu l o s son " + t r i a n gu l o s21 puts metodo ( " coca ina " , " hach i s " , " mariguana " , " e x t a s i s " )22 puts metodo ( ( 1 . . 3 ) . to_a)23 f r a s e = " Dabale a r roz a l a zo r ra e l abad "24 i f es_palindromo? f r a s e25 puts " \"#{ f r a s e }\" es un palindromo "26 else27 puts " \"#{ f r a s e }\" no es un palindromo "28 end

  • William Viana y Andreu Belmonte 21

    $ ruby metodos . rbCuadrado de 2 = 4Los t r i a n gu l o s son ad i f e r e n t e s de l o s cuadradosMe han pasado cocaina , hachis , mariguana , e x t a s i sMe han pasado 1 , 2 , 3" Dabale a r roz a l a zo r ra e l abad " es un palindromo$

    Lo primero que llama la atencin es que se puede omitir la palabra return ya que por defecto los mtodosdevuelven el valor de la ltima lnea evaluada. Con *varios en la lnea 10 lo que se consigue es que el mtodopueda recibir un nmero variable de parmetros, varios es convertido en un array con esos parmetros. Otracosa que se puede omitir son los parntesis en la llamada al mtodo, lo hemos estado haciendo todo el rato conputs y print, pero en llamadas del tipo:A partir de la versin 1.9 de Ruby en esos casos

    ser obligatorio incluir los parntesis para lallamada del mtodo puts cuadrado 4

    puede resultar confuso la omisin de los parntesis, entonces se recomienda incluirlos. . Si un mtodo no recibeargumentos no es necesario incluir los parntesis ni en la definicin ni en la llamada al mtodo.

    4.1.1 Cmo hacer bien un finger

    Tranquilidad, esto no tiene nada que ver con el sexo (aunque por supuesto el ttulo est puesto a conciencia),slo voy a proponer un ejercicio. Sigue leyendo.

    El comando finger en los entornos Unix nos da informacin sobre un usuario si le proporcionas un nombre deusuario. Como ejercicio para practicar un poco te propongo que hagas un finger que pueda recibir tanto unnombre de usuario como el nombre real de la persona (completo o no) y que muestre por pantalla su nombre ysu nombre de usuario en el sistema. Has de tener en cuenta que si se proporciona un nombre muy comn puedenhaber varios usuarios con el mismo nombre, por ejemplo podras mostrar todas las coincidencias. Para hacerlovas a necesitar abrir el fichero /etc/passwd, pero an no he explicado como abrir ficheros. Bueno, aqu va unamanera que creo que entenders fcilmente:

    1 F i l e : : open ( " / e t c /passwd " ) . each { | l i n e a |#procesar }

    Para los parmetros pasados por la lnea de comandos puedes utilizar ARGV, que es una lista con todos losparmetros pasados en la lnea de comandos, teniendo en cuenta que el primer elemento es el primer argumento

  • William Viana y Andreu Belmonte 22

    y no el nombre del programa, como en otros lenguajes como C. No te preocupes mucho por el tratamiento deerrores. De todas formas dejo un ejemplo hecho pero recomiendo que lo intentes hacer por tu cuenta sin mirarloSi tienes curiosidad, en Ruby el nombre del

    programa se almacena en la variable global $0 y luego comparar (puede que lo hayas hecho mucho ms elegante y te podrs rer de m).

    finger.rb1#!/ usr / b in /env ruby2 def buscar ( id )3 l i s t a = [ ]4 F i l e : : open ( " / e t c /passwd " ) . each do | l i n e a |5 l i s t a 1 #mu l t i p l e s matchs13 l i s t a . each_with_index do | va lor , i n d i c e |14 puts " [#{ i nd i c e } ] #{va lo r [ 1 ] } "15 end16 p r i n t " E l i j e uno : "17 until ( 0 . . . l i s t a . l ength )===(i nd i c e = STDIN. ge t s . to_i )18 p r i n t " E l i j e uno : "19 end20 l i s t a [ i n d i c e ]21 else22 l i s t a [ 0 ]23 end24 end2526 i f ARGV. length == 127 log in , nombre = buscar (ARGV[ 0 ] )28 i f l o g i n or nombre29 puts " Login : #{l o g i n } "30 puts "Nombre : #{nombre} "31 else32 puts "No he encontrado ese usuar io "

  • William Viana y Andreu Belmonte 23

    33 end34 else35 puts "Numero erroneo de argumentos "36 end

    4.2 Bloques e iteradoresUn bloque es un trozo de cdigo encerrado entre {} o entre las palabras clave do y end:

    {puts "Un bloque s imple " }do

    puts "Un bloque "puts " con va r i a s l i n e a s "

    end

    Generalmente cuando el bloque tiene ms de una lnea se usa la sintaxis do..end.

    La gracia de los bloques es que se les puede pasar como un argumento a un mtodo.

    bloques.rb1 def metodo ( foo )2 yield f oo3 yield f oo 24 end5 va l o r e s = [ ]6 metodo (3 ) { | x | v a l o r e s

  • William Viana y Andreu Belmonte 24

    devuelve el control al mtodo y justo al volver se encuentra con otro yield que vuelve a devolver el control albloque (como en un juego de ping-pong) pero esta vez le pasa el valor de foo multiplicado por 2. Al final envalores habr un 3 y un 6.

    Ahora te puedes hacer una idea de como est implementado un mtodo each. Un each de nuestra propia claseArray podra ser algo como esto:

    mi_each.rb1 def each2 i = 03 while i < s e l f . l ength4 yield se l f [ i ]5 i+=16 end7 return se l f8 end

    Y eso era un iterador. Vale, an no he explicado nada de clases, tendr que dar un adelanto. self es como elpuntero this del lenguaje C++, es una referencia al propio objeto que llama al mtodo.

    4.2.1 Qu echan en el cine?

    Veamos un ejemplo que luego resultar til. Vamos a la web del cine que suelo frecuentar ultimamente, enconcreto a la seccin cartelera: . Vamos a parsearla y quedarnos slo con los ttulos de las pelis. Para ellotenemos que echar una ojeada al cdigo de la pgina y buscar patrones. Miro el cdigo, basura, basura, basura,lo tengo!

    pe l i c u l a s

    Colegas en e l BosqueEl Corral , Una F i e s ta Muy Best ia . . . .

    Los ttulos de las pelis estn en una zona que empieza con y termina con un. Cada ttulo va entre las etiquetas ttulo de la peli. Ya tenemos los patrones,y ahora qu? Lo primero ser poder bajarse el cdigo de esa pgina para poder tratarlo. Gracias a un japons,

  • William Viana y Andreu Belmonte 25

    que del nombre no me acuerdo, est disponible en Ruby 1.8 la biblioteca open-uri que nos permite abrir unfichero via http y tratarlo como si fuera un fichero de texto normal:require carga el cdigo de otro fichero

    1 r e qu i r e openu r i 2 web = open ( " http ://www. neoc ine . e s / index . php? s=c a r t e l e r a&id=7" )3 web . each_l ine { | l i n e a | puts l i n e a }

    La estrategia ser la siguiente

    Leer el fichero lnea a lnea hasta encontrar una lnea que contenga y luego un smbolo >. Si terindes mira la solucin:

    /]*>/

    As que si encuentras esa lnea para! Puedes parar con un break. Luego hay una lnea fea que no nos interesa,la ignoramos con un web.readlineque lee la lnea y salta a la siguiente. A partir de aqu las lneas contienen losttulos de las pelis entre las etiquetas y . En realidad no, puede que haya alguna lneaen blanca o que al webmaster se le ocurra meter un comentario por ah, as que tenemos que asegurarnos que lalnea cumpla la siguiente expresin regular:

    /]*>.+/i

    Ya tenemos la lnea que nos interesa, ahora deshagmonos de las etiquetas feas que rodean los ttulos:

    linea.gsub( /

  • William Viana y Andreu Belmonte 26

    pelis_en_cartelera.rb1 r e qu i r e openu r i 23 def busca rT i tu l o s4 web = open ( " http ://www. neoc ine . e s / index . php? s=c a r t e l e r a&id=7" )5 l i s t a_p e l i s = [ ]6 web . each_l ine do | l i n e a |7 break i f l i n e a . match ( /]>/ i )8 end9 web . r e ad l i n e10 web . each_l ine do | l i n e a |11 break i f l i n e a . match ( // i )12 i f l i n e a . match ( /]>.+/ i )13 t i t u l o = l i n e a . gsub ( /]+>/ i , " " )14 t i t u l o . strip !15 yield t i t u l o16 l i s t a_p e l i s

  • 5 Un lenguaje con clase

    5.1 Clases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285.1.1 Acceso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315.1.2 Herencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

    5.2 Mdulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335.3 Mixins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

    27

  • William Viana y Andreu Belmonte 28

    5.1 ClasesVayamos al grano. La definicin de la clase va entre las palabras class y end. El nombre de la clase ha deempezar por maysculas. Los constructores de una clase se llaman initialize. Los atributos del objeto empiezanpor una @ y los atributos de la clase por @@.

    1 class Persona2 def i n i t i a l i z e3 @nombre = " Pepeeee "4 @dni = " 12345789A"5 @mail = " pepeeee@pepe . com"6 @login = " pepe "7 @chiste = "Mi j e f e me encargo i r a Barcelona para . . . "8 end910 def contarChi s te11 @chiste12 end13 end

    Para acceder desde fuera de la clase a sus atributos para lectura has de definir un mtodo con el mismo nombreque el atributo. Si quieres modificar el valor de los atributos desde fuera has de definir mtodos que tengan elmismo nombre que el atributo seguido de un smbolo =. La definicin de la clase sigue abierta, por eso podemoshacer:

    1 class Persona2 def nombre3 @nombre4 end5 def l o g i n=(unlog in )6 @nombre = un_nombre7 end8 end

    Ahora tenemos el constructor que habamos definido antes ms los nuevos mtodos. Afortunadamente hay unaforma abreviada de hacerlo.

  • William Viana y Andreu Belmonte 29

    1 class Persona2 attr_reader : nombre , : dni #podemos acceder para l e c t u r a3 at t r_wr i t e r : l o g i n #es l o mismo que e l metodo l o g i n= de antes4 at t r_acce s so r : mail , : c h i s t e #podemos acceder para l e c t u r a y

    modi f i cac ion5 end

    Te acuerdas de los rangos? Puedes definir tus propios tipos de datos y poder crear rangos con ellos. Lo nico quehace falta es que definas un mtodo succ que acte de una manera apropiada, incluir el mdulo Comparable ydefinir el mtodo . WTF! Incluir un moqu dentro de una clase? Bueno, por ahora saber que al hacerlo yteniendo definido el mtodo de gratis nuestra clase gana los mtodos , =, ===, == y algunosms. Ya veremos por qu, ahora veamos todo esto en prctica.

    dia_semana.rb12 class DiaSemana3 Dias_semana = [ " lunes " , " martes " , " m i e r co l e s " , " jueve s " , " v i e r n e s " ,\4 " sabado " , " domingo " ]5 in c lude Comparable67 attr_reader : numdia8 def i n i t i a l i z e ( d ia )9 i f Dias_semana . i n c lude ? dia10 @numdia = Dias_semana . index ( d ia )11 else12 r a i s e ArgumentError , " Dia no va l i do "13 end14 end1516 def (ot rod i a )17 @numdia ot rod i a . numdia18 end1920 def succ21 DiaSemana . new(Dias_semana [ @numdia . succ % 7 ] )22 end

  • William Viana y Andreu Belmonte 30

    2324 def to_s25 Dias_semana [ @numdia ]26 end27 end2829 i f $0 == __FILE__30 l abo r a l = DiaSemana . new( " lunes " ) . . DiaSemana . new( " v i e r n e s " )31 hoy = DiaSemana . new( " domingo " )3233 i f l a b o r a l === hoy34 puts "#{hoy} es un dia l a b o r a l "35 else36 puts "#{hoy} no es un dia l a b o r a l "37 end3839 l abo r a l . each { | d ia | p r i n t "#{dia } " }40 end

    $ ruby diasemana . rbdomingo no es un dia l a bo r a llunes martes m i e r co l e s jueve s v i e r n e s$

    El constructor lo primero que hace es comprobar si se le ha pasado un da de la semana vlido: lo compruebamirando si est en el array Dias_semana con el mtodo include?. Si est almacena la posicin que ocupa elda en el array (equivale a guardar el da en formato numrico empezando con lunes = 0). Si no est lanzauna excepcin de tipo ArgumentError con el mtodo raise. El mtodo (tambin conocido como naveespacial) compara dos objetos y devuelve -1 si el primero es menor que el segundo, 0 si son iguales o 1 si elsegundo es menor que el primero. Eres bastante mayorcito para saber que hace el mtodo succ El mtodo to_ssirve para poder imprimir nuestro objeto por pantalla. La lnea 29 es un truco para saber si el programa ha sidoejecutado directamente (til si lo queremos probar). Cmo puedes ver en la lnea 30 una instancia de nuestraclase se crea con el nombre de la clase seguido de la palabra new y los argumentos que recibe el constructorentre parntesis.

    Las clases pueden tener mtodos de la clase. Un mtodo de una clase no est asociado a un objeto de esa clase,sino a la propia clase. Para llamarlo se hace con el nombre de la clase seguido de :: o . y el nombre del mtodo.

  • William Viana y Andreu Belmonte 31

    La clase File por ejemplo tiene algunos mtodos de clase:

    1 F i l e : : e x i s t s ? #comprueba s i un f i c h e r o e x i s t e2 F i l e : : chmod #cambia l o s permisos de un f i c h e r o s3 F i l e : : rename #renombra un f i c h e r o

    Definir mtodos de una clase se hace de la misma forma: con el nombre de la clase seguido de :: o . y el nombredel mtodo.

    5.1.1 Acceso

    Al igual que otros lenguajes orientados a objeto como Java o C++ tambin se puede definir en Ruby el controlde acceso a una clase. Los modos de acceso son los usuales:

    1 class Foo23 def i n i t i a l i z e #por de f e c t o es pr ivado4 . . .5 end67 p r i va t e #so l o a c c e s i b l e desde dentro d e l o b j e t o8 def bar9 . . .10 end11 pub l i c #ac c e s i b l e desde fuera d e l o b j e t o12 def f oo13 . . .14 end15 protec ted #privado para e l e x t e r i o r pero a c c e s i b l e a l a s c l a s e s que heredan16 def f oobar17 . . .18 end1920#Tambien se puede d e f i n i r e l c on t r o l de acceso despues de d e f i n i r l o s metodos21 p r i va t e : bar22 pub l i c : f oo23 protec ted : foobar24

  • William Viana y Andreu Belmonte 32

    25 end

    5.1.2 Herencia

    Heredar es sencillo.Como curiosidad, todos las clases que definaspor defecto heredan de una clase padre lla-mada Object con algunos mtodos tiles quepuedes sobreescribir y a veces es recomendableque lo hagas. Cuando instancias tu nueva clasecon el mtodo new, ests llamando al mtodonew de la clase Object quien luego le pasa almtodo initialize de tu clase todos los argu-mentos que le han pasado a l.

    1 class Pe l i2 def i n i t i a l i z e ( t i t u l o , d i r e c t o r , duracion , r epar to )3 @t i tu lo = t i t u l o4 @director = d i r e c t o r5 @duracion = durac ion6 @reparto = repar to7 end89 def to_s10 " Ti tu lo : #{@t i tu lo }\n"+\11 " D i r e c to r : #{@director }\n"+\12 " Reparto : #{@reparto }\n"+\13 " Duracion : #{@duracion }\n"14 end15 end1617 class Dvd < Pe l i18 def i n i t i a l i z e ( t i t u l o , d i r e c t o r , duracion , reparto , prec io , n_discos )19 super ( t i t u l o , d i r e c t o r , duracion , r epar to )20 @precio = pr e c i o21 @numero_discos = n_discos22 end2324 def to_s25 super + " Prec io : #{@precio }\n"+\26 "Numero de d i s c o s : #{@numero_discos}\n"27 end28 end

    La clase Dvd es una clase ha de la clase Peli. Los mtodos de la clase Dvd, al llamarse igual, sobreescriben losmtodos heredados pero con el mtodo super dentro de un mtodo se llama al mtodo del mismo nombre de la

  • William Viana y Andreu Belmonte 33

    clase padre.

    Ruby no soporta herencia mltiple pero lo solventa con algo llamado Mixins, que veremos dentro de nada.

    5.2 MdulosUn mdulo es algo parecido a una clase pero ms sencillo. Se utiliza para agrupar cosas que tienen relacin peroque no forman una clase de manera natural. Dentro de un mdulo puedes tener mtodos, variables o clases. Paraacceder a algo de un mtodo se utiliza el operador ::. De hecho has estado utilizando un mdulo todo ese rato sindarte cuenta. Los mtodos print, puts y gets pertenecen al mdulo Kernel y deberas estar llamndolos comoKernel::print, Kernel::puts o Kernel::gets, pero como son mtodos muy utilizados el intrprete de Ruby losbusca automticamente en el mdulo Kernel y por eso puedes omitirlo y simplemente poner puts.

    5.3 MixinsUn mixin, del ingls mezcla, no es ms que una clase con un mdulo dentro. Tienes una clase, le metes un mdulo,ya tienes un mixin. Dentro de una clase puedes meter cuantos mdulos te apetezca y sta heredar todo lo quetena el mdulo. Los mdulos dentro de una clase se comportan como si de una clase padre se trataran. Anteshemos creado un mixin con el ejemplo de la clase DiaSemana. Incluimos el mdulo Comparable y ganamos unmontn de mtodos gratis, slo haba que cumplir una condicin, tener definidos los mtodos y succ, yaque Comparable asume que la clase que lo hereda los tiene definidos.

  • 6 Si no lo apunto se me olvida

    6.1 La clase File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356.2 Bienvenido al mundo falible . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356.3 Qu voy a ver en el cine? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

    34

  • William Viana y Andreu Belmonte 35

    Bueno, trabajar con ficheros en Ruby es muy sencillo, no quera incluir un captulo entero para ello pero tena quecontarlo en algn lado. Y cmo me quedar muy cortito tambin incluyo un poco de tratamiento de excepcionesy un ltimo ejercicio caero.

    6.1 La clase FileVeamos todo sobre la prctica

    1#Leer2 f i c h = F i l e . new( " f i c h e r o " , " r " ) #e l segundo argumento es e l modo de aper tura .3 f i c h . each_l ine { | l i n e a | puts l i n e a } #recorre e l f i c h e r o l i n e a a l i n e a45#opcionalmente puedes usar6 f i c h . r e ad l i n e #que l e e una l i n e a y se s i t u a para l e e r l a s i g u i e n t e7 l i s t a = f i c h . r e a d l i n e s #devue l v e un array de l i n e a s8 cadena = f i c h . read #devue l v e una cadena con todo e l t e x t o d e l f i c h e r o910#Esc r i b i r11 f i c h = F i l e . new( " f i c h e r o " , "w" ) #abre e l f i c h e r o para e s c r i b i r12 f i c h

  • William Viana y Andreu Belmonte 36

    seguida del tipo de excepcin. Si el bloque de cdigo es susceptible de lanzar diferentes tipos de excepciones sepuede incluir un rescue para cada una. En el rescue es dnde tratas la excepcin. Puede hacer que se vuelvea ejecutar el cdigo del begin con un retry o simplemente lanzar tu una excepcin con raise.

    1 begin2 f i c h = F i l e . new( " f i c h e r o " )3 f i c h . each_l ine { | l i n e a | puts l i n e a }4 f i c h . r e ad l i n e5 rescue EOFError6 r a i s e EOFError , " se ha alcanzado e l f i n a l de l f i c h e r o "7 end

    6.3 Qu voy a ver en el cine?ri es un programa que muestra documentacinsobre mtodos, clases y mdulos de Ruby. Esbastante fcil de usar.

    ri palabra_clave

    Soy una persona un poco manitica y normalmente antes de ir al cine compruebo la nota que tiene la pelculaen el imdb. Ahora, estara bien tener una aplicacin que me bajara la cartelera del cine al que voy y que meordenara las pelis segn sus notas, as puedo decidir que peli quiero ver. Te propongo como ejercicio que lohagas, ya hemos visto antes como bajar la cartelera de los Neocine, mitad de la faena hecha, te recomiendo quelo metas en un mdulo y lo guardes en un fichero que se llame por ejemplo neocine_parser.rb. Ahora con cadattulo de una peli tendrs que bajar informacin sobre la pelcula, cmo no hay imdb en castellano, usaremosfilm-affinity que tambin est muy bien. Bsicamente slo tienes que parsear la web. Para buscar informacinen film-affinity usa esta uri: http://www.filmaffinity.com/es/search.php?stext=titulo_peli&stype=title. Dndepone titulo_peli sustituyes por el ttulo de la peli que quieres buscar y ten en cuenta que por ejemplo los espaciosen blanco los tendrs que sustituir por %20 y los carcteres con acentos por sus respectivos cdigos. Vas a tenerque buscar algo de informacin, es un buen momento para aprender a usar ri para buscar en la documentacinde Ruby. Suerte :P Bueno, vale, no te voy a dejar tan tirado, colgar cuando me apetezca una solucin y lapondr aqu http://www.aditel.org/~wviana/ruby/Cartelera.tar.gz

  • 7 Qt4-Ruby

    7.1 Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387.2 Estructura de un interfaz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

    7.2.1 SignalnSlots: Connecting Peoples objects . . . . . . . . . . . . . . . . . . . . . . . . . 397.3 Diseo del interfaz: Designer-qt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407.4 Implementacin de la funcionalidad del interfaz . . . . . . . . . . . . . . . . . . . . 447.5 Aplicacin principal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

    37

  • William Viana y Andreu Belmonte 38

    7.1 IntroduccinQt es una biblioteca multiplataforma para desarrollar interfaces grficas de usuario. Fue creada por la compaanoruega Trolltech. Qt es utilizada en KDE, un entorno de escritorio para sistemas como linux o FreeBSD, entreotros. Utiliza el lenguaje de programacin C++ de forma nativa.

    Qt4-ruby son los binding de Qt4 para ruby. Permite realizar aplicaciones grficas utilizando dichas libreras peroutilizando nuestro lenguaje de programacin favorito ruby ;).

    El proceso se dividir bsicamente en dos etapas. En la primera de ellas disearemos como ser nuestra aplicacinvisualmente: como le mostraremos por pantalla al usuario los datos y como podr introducirlos l. En una segundafase definiremos como interactuar con cada uno de los elementos y como interactuarn los elementos entre s.

    El objetivo final de este documento no es ensear como trabajar con las Qt, sino proporcionar los conocimientosProgramming isnt about what you know; itsabout what you can figure out. As long as youknow where to find out the things you forgot,youre doing just fine. Chris Pine

    y las herramientas necesarias para poder utilizarlas con ruby y describir un breve ejemplo de como hacerlo.

    7.2 Estructura de un interfazQt est estructurado en clases. Hay clases que estn en lo alto de la jerarqua y hay otras que heredan de estas.No vamos a entrar a explicar demasiado detalladamente como se estructura, pero a grandes rasgos (y teniendoen cuenta los cambios que ha habido con la nueva versin) las clases que ms comnmente usaremos las podemosdividir en estos grandes grupos:

    QWidget:: Clase base para crear varios tipos de ventana

    QMainWindow:: Ventana principal de aplicacin, posiblemente con mens, barras de herramientas, barrasde estado,. . .

    QDialog:: Ventana de dialogo para tareas simples y a corto trmino: dilogos de error, abrir archivos,seleccionar color,. . .

    QLayout:: clase base para el manejo de geometras, redimensionamiento automtico para componer dilogos mscomplejos:

    QBoxLayout:: de sta clase heredan QHBoxLayout y QVBoxLayout para construir diseos en horizontal overtical.

    QGridLayout:: til para construir diseos en forma de cuadrcula QStackedLayout:: para crear un conjunto de widgets de los que solo se muestra uno cada vez

  • William Viana y Andreu Belmonte 39

    De QWidget tambin heredan las clases de de los elementos bsicos de un interfaz como pueden ser:

    QComboBox:: Lista emergente de datos, que puede ser editable para introducir nuevos elementos QLabel:: para mostrar texto e imgenes QPushButton botn QTextBrowser :: Caja de edicin de texto con tags HTML

    7.2.1 SignalnSlots: Connecting Peoples objects

    Es posiblemente la mayor diferencia entre Qt y los otros toolkits de programacin grfica. Mientras la mayorade otros entornos utilizan los callbacks en Qt usaremos los Signals y los Slotss.Callback: es un puntero a una

    funcin, que le pasas a una fun-cin de tratamiento de un deter-minado evento. Cuando ocurre unevento en un objeto, la funcin detratamiento llama a nuestra fun-cin callback.

    Una Signal es emitida cuando un determinado evento ocurre, los objetos de Qt disponen de numerososeventos que generarn su correspondiente seal.

    Un Slot es una funcin que se llama como respuesta a una determinada seal (pero que tambin puede serllamada directamente desde nuestro cdigo).

    Lo que tenemos que hacer es conectar cada seal que queremos tratar con un slot o incluso varios si fueranecesario. .Tambin podemos conectar seales con

    seales: cuando se emite una seal, automti-camente sta hace que se emita la segunda Las Seales y los Slots no saben si estn conectadas o si hay alguien conectado a ellas lo que garantiza queestemos creando componentes independientes entre s.

    Tomemos como ejemplo un botn instanciado de la clase Qt::PushButton. Las acciones que podemos realizar conun botn son:

    Evento Seal emitidaPresionar el botn pressedDejar de presionarlo releasedPulsarlo: Presionar+Dejar clicked

    Si queremos que nuestra aplicacin trate el botn cuando sea pulsado, deberemos conectar su seal con un slotque nosotros definamos:

    \ t e x t i t {Qt } : : Object . connect (@Boton ,SIGNAL( c l i c k e d ( bool ) ) , se l f ,SLOT( func ion ( ) ) )

  • William Viana y Andreu Belmonte 40

    A la hora de la verdad no ser necesario realizar este proceso manualmente. Por un lado, cuando queramosPara el caso anterior, con definir una funcincon nombre on_Boton_Clicked() hubiera sidosuficiente.

    conectar unas seales con otras lo haremos en el propio designer-qt4 de forma grfica. Y por otro lado, paraconectar las seales con nuestras funciones, utilizaremos una nomenclatura determinada y el propio sistema noslas conectar automticamente.

    7.3 Diseo del interfaz: Designer-qtPara poder disear nuestro interfaz podramos crear a mano definiendo en nuestro cdigo los distintos elemen-tos indicando sus propiedades y coordenadas. Pero ser mucho ms fcil si utilizamos la aplicacin que nosproporcionan las propias Qt, el QtDesigner.

  • William Viana y Andreu Belmonte 41

    Las partes principales del interfaz que usaremos son:

    Qt Desinger (ventana principal) ah tenemos todos los elementos para poder arrastrarlos a nuestra aplicacin

    Property Editor editor de propiedades del elemento que tengamos seleccionado

    Object Inspector lista jerrquica con las clases que estamos usando en nuestro interfaz

    Signal/Slot Editor podremos editar las conexiones que tengamos y aadir nuevas manualmente

    Inicialmente deberemos seleccionar que tipo de venta queremos crear, normalmente Main Window o Widget

    A la hora de crear nuestras aplicaciones ser interesantes que organicemos los elementos en layouts para que seredimensionen automticamente con la ventana.

    En el propio desginer podremos definir que seales queremos conectar, como se ha visto antes se pueden relacionarvarios tipos de seales y eventos, pero en este caso, solo lo utilizaremos para relacionar elementos entre s.presionando F4 entraremos en modo Edit Singals/Slots, el funcionamiento es Drag&Drop1, seleccionamos unelemento de el que queremos capturar una seal y los soltamos en otro al que le queremos activar otra. Nosaparecer una ventana de dialogo donde deberemos seleccionar concretamente las seales que queremos conectar(como se muestra en la figura).1 arrastrar y soltar

  • William Viana y Andreu Belmonte 42

    Generar el cdigo

    Una vez creado el interfaz lo guardaremos como fichero .ui, esto es, un fichero en XML con la especificacin deEs recomendable utilizar una nomenclaturams o menos formal para cada tipo de fichero.Por ejemplo:

    ui_nombreinterfaz.rb para la especifi-cacin del interfaz

    nombreinterfaz.rb para la parte de im-plementacin que veremos ms adelante

    nuestra ventana. Tendremos que transformarlo en cdigo para poderlo utilizar en nuestra aplicacin. Y paraello utilizaremos la herramienta rbuic que nos proporcionan los propios bindings de qt4-ruby. La forma de usoes muy simple:

    $ rbu i c form . u i > ui_form . rb$

    Opcionalmente le podemos pasar el parmetro -x que nos generar el cdigo necesario para poder cargar direc-tamente la aplicacin desde la linea de comandos y comprobar que est todo correcto.

    Como ejemplo el cdigo que correspondera a la siguiente ventana:

  • William Viana y Andreu Belmonte 43

    ui_form.rb1 class Ui_Form2 attr_reader : l a b e l3 att r_reader : pushButton45 def setupUi ( form )6 form . setObjectName ( " form " )7 @label = Qt : : Label . new( form )8 @label . setObjectName ( " l a b e l " )9 @label . setGeometry (Qt : : Rect . new(110 , 60 , 191 , 91) )10 @label . setFrameShape (Qt : : Frame : : Box)11 @pushButton = Qt : : PushButton . new( form )12 @pushButton . setObjectName ( " pushButton " )13 @pushButton . setGeometry (Qt : : Rect . new(170 , 210 , 80 , 27) )14 r e t r an s l a t eU i ( form ) ;15 s i z e = Qt : : S i z e . new(445 , 296)16 s i z e = s i z e . expandedTo ( form . minimumSizeHint ( ) )17 form . r e s i z e ( s i z e )1819 Qt : : MetaObject . connectSlotsByName ( form )20 end # setupUi2122 def r e t r an s l a t eU i ( form )23 form . setWindowTitle (Qt : : App l i cat ion . t r a n s l a t e ( "Form" , "Form" , nil , Qt : :

    App l i ca t i on : : UnicodeUTF8) )24 @label . setText (Qt : : App l i ca t i on . t r a n s l a t e ( "Form" , " TextLabel " , nil , Qt : :

    App l i ca t i on : : UnicodeUTF8) )25 @pushButton . setText (Qt : : App l i ca t i on . t r a n s l a t e ( "Form" , " PushButton " , nil , Qt : :

    App l i ca t i on : : UnicodeUTF8) )26 end # re t r an s l a t eU i2728 end29 module Ui30 class Form < Ui_Form31 end32 end # module Ui

  • William Viana y Andreu Belmonte 44

    7.4 Implementacin de la funcionalidad del interfazYa tenemos nuestro interfaz. Ahora deberemos de conectar los widgets con las funciones de nuestra aplicacin.

    En el fichero del interfaz tenemos implementado un modulo Ui que incluye la clase Form. Crearemos un nuevoPara poder acceder a las propiedades decualquiera de los elementos del interfaz, ten-dremos que hacerlo a travs de dicha variable,por ejemplo @ui.pushButton corresponder alobjeto que contiene el botn.

    fichero en el que tendremos que incluir la definicin del interfaz, el mtodo initialize (el constructor) deber crearun objeto de la clase que corresponder a una instancia de Ui::Form.

    form.rb1 r e qu i r e ui_form . rb 23 class Form < Qt : : Widget4 s l o t s on_pushButton_released ( ) 56 def i n i t i a l i z e ( parent=ni l )7 super ( parent )8 @ui=Ui : : Form . new9 @ui . setupUi ( s e l f )10 end1112 def on_pushButton_released ( )13 @ui . l a b e l . setText ( " hola " )14 end15 end

    Tenemos definido un slot, que corresponde con la funcin on_pushButton_released():

    on_nombre del widget pushButton _ released

    evento capturado

    Siguiendo este formato tendremos nuestras seales y slots conectados ya que en el constructor se ejecuta elmtodo connectSlotsByName.

    Como vemos capturar el evento de pulsado del botn pushButton, y lo que har es cambiar el texto del labelPara consultar informacin referente a losmtodos y clases, disponemos del comandorbqtapi equivalente al ri normal de ruby

    mediante el mtodo setText propio de la clase Qt::Label.

    En ocasiones no nos valdr con la definicin por defecto o querremos definir nuestras seales a mano, lo normalser hacerlo en el constructor:

  • William Viana y Andreu Belmonte 45

    Qt : : Object . connect (@ui . l i s t a , SIGNAL( i temCl icked ( QListWidgetItem ) ) , se l f ,SLOT( on_lista_itemDoubleCl icked ( QListWidgetItem ) ) )

    7.5 Aplicacin principalPor ltimo crearemos un nuevo fichero en el que incluiremos nuestra nueva clase Form. De esta forma, podremosaadir en nuestra aplicacin todas los interfaces que sean necesarias. En este cdigo simplemente crearemos unainstancia de aplicacin (lnea 4) y le incluiremos un nuevo objeto de nuestra ventana (lnea 5):

    main.rb1 r e qu i r e form . rb 23 i f $0 == __FILE__4 a = Qt : : App l i ca t i on . new(ARGV)5 u = Form . new6 u . show7 a . exec8 end

  • 8 Dice la leyenda que se empieza por documentar y se acaba porimplementar

    8.1 Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478.2 SimpleMarkup o yo solo s HTML, como se juega a esto? . . . . . . . . . . . . . 478.3 y ahora?. . . ejecucin sobre nuestro cdigo . . . . . . . . . . . . . . . . . . . . . . . 50

    46

  • William Viana y Andreu Belmonte 47

    8.1 IntroduccinEn ruby existen dos formas de generar documentacin a partir del propio cdigo: rdoc y RDtool (tambinA la hora de documentar no hay que perder

    de vista, que lo que queremos hacer no es ex-plicar que hace cada lnea de nuestro cdigo,sino cual es el cometido de cada uno de suspartes: que hacen nuestros mtodos, para quesirve nuestra nueva clase, . . . Cuando pasadoun tiempo queramos recuperar un proyecto,o cuando queramos pasrselo a otra personaagradeceremos haber realizado algunas anota-ciones.

    disponible para otros lenguajes).

    Mientras que rdoc es bsicamente un documentador de cdigo, RDtool es un lenguaje de marcado que no entiendenada de cdigo. Con RDtool necesitas introducir etiquetas del tipo =begin/=end. En cambio rdoc parsea losficheros de cdigo fuente extrayendo las clases, mdulos, atributos y definiciones de mtodos automticamente.

    Osea que rdoc es el documuentador de cdigo para los vagos ;), pero que eso no os confunda, tambin disponede un lenguaje propio en caso de que queramos ser ms descriptivos a la hora de trabajar

    8.2 SimpleMarkup o yo solo s HTML, como se juega a esto?Bsicamente rdoc ir pillando todos los comentarios justamente anteriores a vuestras clases/mdulos/mtodos ylo aadir a la documentacin. si queremos que quede ms bonito ser interesante aadir ciertas etiquetas. Paraconsultar el cdigo y el resultado de los ejemplos que se irn mostrando se puede acceder a la siguiente direccin:

    http://www.aditel.org/~andreu/ruby/rdoc_example/

    verbatim

    Todas las lineas que comiencen a la misma distancia del margen sern tratadas como prrafos, pero si le aadimosun nivel de identacin nos lo meter como verbatim, es decir, no procesar las directivas que encuentre dentro.

    1#Esto es una l i n e a de comentario2# pero aqui no trataremos l o s t a g s que3# veremos mas ade lante , como puede ser :4# neg r i t a 5 class Verbatim6 end

    Formateo del texto

    Tenemos tres tipos de letra: negrita, cursiva y mquina de escribir. Tenemos dos formas de etiquetar el texto:rodeando la palabra con smbolos espaciales (*,+,_) o utilizando tags del tipo HTML:

  • William Viana y Andreu Belmonte 48

    1# negr i ta :2# \negr i ta 3# \ neg r i t a 4# curs iva 5# \curs iva 6# \_cursiva_7# maquina de e s c r i b i r 8# \maquina de e s c r i b i r 9# \+maquina de e s c r i b i r+10 class Formateo_del_texto11 end

    Listas y descripciones

    Las listas ya aparecan en el apartado anterior, podemos utilizar varios tipos:

    1# un o para l i s t a s imple2# un numero segu ido de un punto3# para una l i s t a numerada4# 1. uno5# 2. dos6# 3. t r e s7# una l e t r a segu ida de un punto8# para numerar con l e t r a s9# a . a10# b . be11# c . ce12 class Li s tas_y_descr ipc iones13 end

    Comentarios comentados (???)

    Si en ocasiones aadimos anotaciones con comentarios internos para uno mismo (tu ya me entiendes), es intere-sante que luego no aparezca en la documentacin final. . . no queda bonito. Lo delimitaremos con # y #++:

    1#Esta c l a s e es muy importante

  • William Viana y Andreu Belmonte 49

    2#3#ja j a j a pero s i no va l e pa na4#pero bueno5#++6#no hay que de jar de u sa r l a7 class Comentarios8 end

    Titulos

    En este ejemplo podemos ver como hacer titulo con fuentes de tamao ms grande. Faros en el resultado final,observad que los datos que devuelve la funcin con el yield, nos aparecen como datos de entrada de la funcinen formato de bloque.

    1#=Ti tu lo12#Esto es t e x t o de e s t e parra fo3#4#==Ti tu lo25#Texto d e l o t ro6#7#8 class Ti tu l o s9 def each10 @datos . each do | dato |11 yield dato12 end13 end1415 def [ ] ( i n d i c e )16 return @datos [ i nd i c e ]17 end18 end

  • William Viana y Andreu Belmonte 50

    8.3 y ahora?. . . ejecucin sobre nuestro cdigoDebemos ejecutar el comando rdoc indicando el directorio donde est nuestra documentacin y el formato desalida (entre otro parametros). En nuestro caso ser interesante utilizar el parametro -c para indicarle queencoding hemos usado en nuestro cdigo seguramante:

    andreu@artur i to :~/work/$ rdoc c ut f8 example . rbandreu@artur i to :~/work/$ rdoc c i so8859 15 example . rb

    En cuanto a formatos de salia, dispone de filtros para HTML, XML, chm (en windows) y lo que es ms interesante,dispone de un filtro para generar documentacin que despus utilizar el ri. Por defecto nos generar en elsubdirectorio doc del proyecto, la documentacin en html. Si queremos que nos genere la documentacion parausar con ri, simplemente debemos de pasarle el parametro -r

    andreu@artur i to :~/work/$ rdoc c ut f8 r example . rb

    example . rb : . . .Generating HTML. . .

    F i l e s : 1C la s s e s : 0Modules : 0Methods : 3Elapsed : 0 .339 s

    andreu@artur i to :~/work/$

    Una vez generada, la almacenar en nuestro home y podremos consultarla como si fuera una clase/mtodo delpropio sistema:

    andreu@artur i to :~/work/$ r i Verbatim Class : Verbatim

    Esto es una l i n e a de comentariopero aqui no trataremos l o s tags queveremos mas adelante , como puede s e r :negr i ta

    andreu@artur i to :~/work/$

  • 9 Material relacionado

    RubyPgina ofcial de Ruby - http://www.ruby-lang.org/esWhys (Poignant) Guide to Ruby - http://poignantguide.netProgramming Ruby: The Pragmatic Programmers Guide - http://www.rubycentral.com/book/

    QtRubyKorundum/QtRuby - Ruby-KDE/Qt bindings project - http://rubyforge.org/projects/korundum/KDE Developers Corner: Ruby bindings - http://developer.kde.org/language-bindings/ruby/index.htmlQt Reference Documentation (Open Source Edition) - http://doc.trolltech.com/4.2/

    rdocrdoc - http://rdoc.sourceforge.net/

    51

  • 10 Agradecimientos

    Este manual lo hemos escrito para que sirva de material de apoyo para el curso de Ruby/Qt4 que lo podremosdar gracias a ADITEL. Gracias tambin al departamento de lenguajes y sistemas informticos y al departamentode ingeniera y ciencia de computadores de la Universitat Jaume I por subvencionar el curso.

    Queremos agradecer en particular a nuestros amigos que nos han apoyado y ayudado mientras escribiamos estemanual, gracias a lvaro Cuevas por la ayuda con las Qt4, gracias a Ignacio Gil, quien ha sido como un manualde LATEXpara nosotros, gracias a Antonio Prez con los layouts del Qt-Designer y gracias a Rubn y a Rosa poracojernos en su casa y darnos de comer durante los fines de semana que hemos pasado all escribindolo.

    52

  • 11 Sobre este documento

    Podrs encontrar una versin electrnica de este documento en la direccin http://www.aditel.org/~wviana/ruby/manual_ruby.pdf.

    Esta obra est bajo una licencia Reconocimiento 2.5 Espaa de Creative Commons. Para ver una copia de estalicencia, visite http://creativecommons.org/licenses/by/2.5/es/legalcode.ca o envie una carta a CreativeCommons, 559 Nathan Abbott Way, Stanford, California 94305, USA.

    53

  • William Viana y Andreu Belmonte 54

    El logo de Ruby es copyright(c) 2006 de Yukihiro Matsumoto y se distribuye bajo los trminos de la licenciaShare-Alike 2.5 de Creative Commons: http://creativecommons.org/licenses/by_sa/2.5/

    Introduccinputs "Ruby mola mazo!"Invocando el intrpreteVariablesTiposNmerosCadenasSmbolosRangosExpresiones regularesArraysHashes

    Condicionando y repitiendoExpresionesif y unlesscase

    Bucleswhile y untilfor

    New kids on the blockMtodosCmo hacer bien un finger

    Bloques e iteradoresQu echan en el cine?

    Un lenguaje con claseClasesAccesoHerencia

    MdulosMixins

    Si no lo apunto se me olvidaLa clase FileBienvenido al mundo falibleQu voy a ver en el cine?

    Qt4-RubyIntroduccinEstructura de un interfazSignal'n'Slots: Connecting Peoples' objects

    Diseo del interfaz: Designer-qtImplementacin de la funcionalidad del interfazAplicacin principal

    Dice la leyenda que se empieza por documentar y se acaba por implementarIntroduccinSimpleMarkup o yo solo s HTML, como se juega a esto?y ahora?ejecucin sobre nuestro cdigo

    Material relacionadoAgradecimientosSobre este documento