Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Ruby Tutorial
Leccin 1
Introduccin Instalacin El Primer Programa Nmeros en Ruby Strings y diversin Variables Alcance de las variables
Leccin 2
Introduciendo Datos Normas en los nombres Los m todos Los m todos! argumentos Rangos Arrays
Leccin 3
"lo#ues $%s malabares con strings E&'resiones Regulares (ondicionales "ucles Nmeros Aleatorios
Leccin 4
(lases y )b*etos Accesores +ic,eros! lectura-escritura (argando librer.as /erencia de clases $odi0icando clases (ongelando ob*etos Seriali1ando ob*etos
Leccin 5
(ontrol de acceso E&ce'ciones $dulos (onstantes /as,es y S.mbolos La clase Time
Leccin 6
sel0 Duc2 Ty'ing A1car Sint%ctico Test de unidades
contacto
e3mail t4itter
licencia sitio
Ruby en 15 Minutos
+old Table of Contents 5/ola mundo5 Asignaciones irb y ri Sinta&is variables6 constantes6 m todos677 0unciones6 strings inter'olados6 nmeros De0inicin de 0unciones (lases y ob*etos Todo es un ob*eto8 De0inicin de clases /erencia de clases Accesores (lases! e&tendiendo las clases E&ce'ciones $dulos De0inicin /erencia mlti'le Arrays Arrays! los arrays 'ueden ser usados como 'ilas o colas /as,es 9diccionarios:
"lo#ues e iteradores "lo#ues! de0inicin "lo#ues! sinta&is Iteradores "lo#ues! salvando los blo#ues Estructuras de control case condicionales verdadero y 0also bucles E&'resiones regulares ;nidades de Testeo Por #u Re#uisitos Este resumen est% basado en Ruby (ourse de "rian Sc,r<der7
'Hola mundo'
puts 'Hola mundo' salida! Hola mundo
signaciones
# Toda asignacin devuelve su valor a = 4 # 4 # Las asignaciones se pueden usar en cadena a = b = 4 # 4 a + b # 8 # y usados fichero = cont)linea cont)linea # -ta.os a += / a = a+/ en un test ile!open"'!!#tutor!t$t'% # #& ile'!!#tutor!t$t( = * # * += + ,hile "line = fichero!gets%# nil # 0 # 8
# -signacin en paralelo a1 b = b1 a # 241 83 # 4ividiendo arrays array = 2+1 /3 # 2+1 /3 a1 b = 5array # 2+1 /3
irb y ri
irb! es el int r'rete interactivo de ruby6 donde se 'ueden 'robar al vuelo 'orciones de cdigo7 ri! ,erramienta 'ara acceder a la documentacin7 Por e*em'lo6 'ara documentarnos sobre el m todo tr de la clase 6tring6 'onemos en la l.nea de comandos! ri 6tring#tr
!inta"is
#ariables$ constantes$ m%todos$..
Variables - Mtodos: estudiante6 i6 e'silon6 'iso=grande Las variables y los m todos se 'arecen7 Esto es lgico6 'uesto #ue una variable se 'uede sustitu.r 'or un m todo7 Las variables y los mtodos deben ser escritos en minsculas6 #ue em'iecen 'or una letra6 y #ue contengan cual#uier car%cter al0anum rico o el guin ba*o7 Por e*! piso)grande7 Sin embargo6 las clases deben em'e1ar 'or mayscula7 Adem%s6 a di0erencia de los m todos-variables6 no se usa el guin ba*o 'ara nombres com'uestos7 Por e*! 7iso8rande7 Las clases deben em'e1ar 'or mayscula7 Adem%s6 a di0erencia de los m todos-variables6 no se usa el guin ba*o 'ara nombres com'uestos7 Constantes: PD+=>E?6 R@D@6 PERS)NA=VIAAE Las constantes slo se 'ueden de0inir una ve17 Las constantes deben ser escritas en letras maysculas7 Variables de objeto: Bnombre6 Bma&imo6 B,ora=comer Las variables de ob*eto 9o variables de instancia: slo 'ueden ser le.das-escritas 'or el 'ro'io ob*eto7 Variables de clase: ob*eto6 llave=maestra Las variables de clase no 'ertenecen a los ob*etos6 si no a la clase7 E&isten nicamente en la clase6 y son com'artidas 'or todos los ob*etos7 Variables globlales: Cglobal6 CD6 Ccontador El uso de las variables globales ,a sido declarado un crimen ca'ital 'or la escuela del buen diseEo7 Smbolos: !nombre6 !edad6 !(lase Los s.mbolos son identi0icadores nicos #ue los encontraremos en varios sitios7
def multi)foo"count = ;% 'foo'5count end # Los par<ntesis pueden omitirse1 si la situacin no es ambigua multi)foo";% # :foo foo foo: puts :hola mundo: : hola mundo # 7ara interpolar valores dentro de los strings' # i! =sar comillas dobles # ii! =sar #>!!!? '6imple #>multi)foo"/%?' # 6imple #>multi)foo"/%? :@nterpolado #>multi)foo?: # @nterpolado foo foo foo # ABmeros +* # *!C # /eD4 # *$ # *+* # +* *!C *!***/ 0CC;C 8
(e&inicin de &unciones
Las 0unciones se de0inen 'or la 'alabra clave def def hola"programador% puts :Hola #>programador?: end hola"'7epe'% # Hola 7epe
)lases y ob*etos
+odo es un ob*eto,
8acostmbrate a usar la notacin del "C!0%!round "C!0%!class "C!0%!round!class # 0 # loat # i$num
!m<todo
'un string'!length # E 'un string'!class # 6tring 'pepe dice'!gsub"'p'1't'% # 'tete dice' 'abc'!gsub"'b'1'$$$'%!length # C 2'algunas'1 'cosas'1 'array'3!length 2'algunas'1 'cosas'1 'array'3!reverse # ; # 2'array'1 'cosas'1 'array'3
# -l ser un ob.eto1 el m<todo suma es' +!+"/% # ; # pero para estos casos hay un aFBcar sint9ctico'
+ + /
# ;
(e&inicin de clases
class 7ersona def initialiFe"nombre% Gnombre = nombre end def saludar :Hola1 mi nombre es #>Gnombre?!: end end pepe = 7erson!ne,"'7epe'% puts pepe!saludar # Hola1 mi nombre es 7epe
Herencia de clases
class HatF & 7ersona def initialiFe super"'IuJihiro Hatsumoto'% end end puts HatF!ne,!saludar # Hola1 mi nombre es IuJihiro Hatusmoto
ccesores
Los accesores son 0unciones #ue 'ermiten el acceso a los atributos de un ob*eto7 class 7erro def initialiFe"nombre1 raFa% Gnombre = nombre GraFa = raFa end # para leer las propiedades de un ob.eto def nombre Gnombre end def raFa GraFa end end perro+ = 7erro!ne,"'Trampas'1 'palleiro'% perro+!nombre # Trampas perro+!raFa # palleiro Esto es e#uivalente a!
class 7erro def initialiFe"nombre1 raFa% Gnombre = nombre GraFa = raFa end attr)reader 'nombre1 'raFa end perro+ = 7erro!ne,"'Trampas'1 'palleiro'% perro+!nombre # Trampas perro+!raFa # palleiro Esta es la tabla con el ti'o de accesores6 y su 0uncin! accesor attr=reader attr=4riter funcin lectura escritura
."cepciones
La ca'tura se ,ace mediante rescue 'revio uso de begin! begin # Ldigo Mue puede dar problemas rescue LlaseN$cepcion+ =( e$ception+ # 6e e.ecuta si se lanFa una LlaseN$cepcion+ rescue LlaseN$cepcion/ =( e$ception/ # 6e e.ecuta si se lanFa una LlaseN$cepcion/
rescue # Laptura cualMuier e$cepcin ensure # Ldigo Mue siempre se e.ecuta end Para lan1ar una e&e'cin6 usaremos raise
Mdulos
(e&inicin
Los mdulos son similares a las clases en #ue contienen una coleccin de m todos6 constantes y otros mdulos y de0iniciones7 Pero a di0erencia de las clases6 no se 'ueden crear clases derivadas de los mdulos7 # trig!rb module Trig 7@ = ;!+4+0 # m<todos def Trig!sin"$% # !!! end def Trig!cos"$% # !!! end end reMuire 'trig' Trig!sin"Trig''7@#4% # :'': D( 7@#4 de la clas Trig
Herencia m'ltiple
Podemos aEadir 0uncionalidades de distintos mdulos! module 4+ !!! end module 4/ !!! end class LlaseLualMuiera include 4+ include 4/ end
rrays
# -rray literal
2'=n'1 'array'1 'con'1 C1 'entradas'3!.oin"' '% # =n array con C entradas # Auevo array a = -rray!ne, a && 'algunas' && 'cosas' a2/3 a2*3 = ; a # # # # # 23 algunas cosas cosas ; ; cosas
# 6e pueden usar valores por defecto!!! -rray!ne,"41 *% # 2*1 *1 *1 *3 # !!!pero ten cuidado a = -rray!ne,"/1 '6ilJe'% a2*3 && '-mberg' a # 2'6ilJe'1 '6ilJe'3 # 6ilJe -mberg # 2'6ilJe -mberg'1 '6ilJe -mberg'3
Has/es 0diccionarios1
# Hash literal h* = >'uno' =( +1 'dos' =( /? h*2'uno'3 # + # Pellenando un hash h+ = Hash!ne, #>? h+2'.oya'3 = 'ruby' h+2'fruta'3 = 'banana' h+ # >:.oya:=(:ruby:1 :fruta:=( :banana:? # - menudo1 los sQmbolos se usan como llaves h/ = >'.unio =( 'perl'1 '.ulio =( 'ruby'? h/2'.ulio3 # ruby
2lo3ues e iteradores
2lo3ues- de&inicin
;n blo#ue es una 'ie1a de cdigo6 similar a un 0uncin annima7 ;na 0uncin 'uede usar un blo#ue como argumento7 # =n iterador sencillo1 llamando al bloMue por cada elemento del array 2'soy'1 'un'1 'platano'3!each do KelementoK print elemento1 ' ' end #soy un platano # Rtro iterador muy usado! Nl bloMue modifica el conte$to done fue creado fac = + +!upto"C% do KiK fac 5= i end fac # +/* # Nl resultado del bloMue puede ser usado por Mui<n lo usa!!! 2+1/1;141C3!map> KnumK num5num? # 2+141E1+01/C3 # !!!y puede usarse m9s de un argumento "*!!+**%!in.ect"*%> Kresultado1 numK result + num? #C*C*
2lo3ues- sinta"is
# Los bloMues son encerrados por do KK !!! end 2+1/1;141C3!each do KeK puts e end # o por par<ntesis >KK !!! ? 2+1/1;141C3!map> KeK e5e? Por convencin! usa do || end donde las modi0icaciones sean im'ortantes y {|| } donde el valor de retorno sea im'ortante #2+141E1+C1/C3
4teradores
def f"cont1 SbloMue% valor = + +!upto"cont% do KiK valor = valor 5 i blocJ!call"i1 valor% end end f"C%!do Ki1 f)iK puts :f"#>i?% = #>f)i?: end f"+% = + f"/% = / f";% = 0 f"4% = /4 f"C% = +/*
GbloMue = bloMue Gcont = * end def repetir Gcont += + GblocJ!call"Gcont% end end repetidor = Pepetidor!ne, do KcontK puts : He has llamado #>cont? veces: end ;!times do repetidor!repetir end He has llamado + veces He has llamado / veces He has llamado ; veces
.structuras de control
case
def saludar"5nombres% # 5 indica nBmero indefinido de argumentos case nombres!length ,hen * :Tue triste1 nadie ha leido mi tutorial: ,hen + :Hola #>nombres?! 7or lo menos una persona Muiere saber Puby: ,hen /!!C :Hola #>nombres!.oin"'1 '%?! 8racias por venir: ,hen 0!!+/ :#>nombres!length? lectores! Uienvenidos a PubyV: else :Wo, #>nombres!length? lectores! Luanta genteV: end end puts saludar"'-le.andro'1 'Luis'1 '7edro'1 '-ntonio'1 '8uido'1 'HatF1 '6atish'% # X lectores! Uienvendios a PubyV
condicionales
Ruby tiene todas las estructuras de control est%ndar7 ? adem%s6 se 'ueden ane&ar a una e&'resin7 # Nstructura de control habitual!!! if "+++ == /% :He gusta la escuela: else :Henuda sorpresaV: end #!!!Mue podemos ane$ar a la derecha :He gusta la escuela!: if "+++ == /% # :He gusta la escuela:
# nil # Lorrecto
prob)lluvia = rand"+**% # 04 "por e.emplo% case prob)lluvia ,hen *!!!+* then :7robabilidad m9s ba.a: ,hen +*!!!C* then :Ua.a probabilidad: ,hen C*!!!E* then :-lta probabilidad: ,hen E*!!!+** then :7robabilidad m9s alta: end # -lta probabilidad
#erdadero y &also
Fnicamente
def es)true"valor% puts valor O true ' false end # nil es)true"false% es)true"nil% es)true"true% es)true"+% es)true"*% es)true"2*1+1/3% es)true"'a'!!'F'% es)true"''% es)true"'un)simbolo% # # # # # # # # # false false true true true true true true true
bucles
Ruby tiene donde elegir en las construcciones de bucles6 H'ero no ,ay #ue olvidarse de los blo#uesI i = + # +
,hile "i & +*% i 5=/ end # nil puts i # +0 i 5= / ,hile "i & +**% puts i begin i 5= / end ,hile "i & +**% puts i # nil # +/8
# nil # /C0
breaJ i if "i (= 4***% i 5= / end # 4*E0 puts i # 4*E0 4!times do i 5= / end puts i r = 23 for i in *!!X ne$t if i Y / == * r && i end puts r # 4 # 0CC;0 # 23
# *!!X # 2+1 ;1 C1 X3
."presiones regulares
En las e&'resiones regulares! Se 'onen entre / / (ual#uier caracter concuerda con si mismo6 e&ce'to \/^$|.+*?()[]\{\} #ue tienen distintas 0unciones dentro de las e&'resiones7 Para 'oder buscarlos6 ,ay #ue usar la secuencia de esca'e J7 P7 e*! JJ6 J-68 ^ busca el 'rinci'io de una l.nea6 $ busca el 0inal de una l.nea . busca cual#uier car%cter Si a,b o o o o o son e&'resiones regulares6 entonces! ab es tambi n una e&'resin regular aK es una e&'resin regular #ue busca el caparazn de a a+ es e#uivalente a aaK a|b busca a L b Las e&'resiones 'ueden ser agru'adas 'or 'ar ntesis7 P7 e*!
#"aKb%c# # busca >'ac'1 'bc? #aKbc# # busca >'a'1 'bc'? [caracteres busca un rango de caracteres7 #2aDF-DZ*DE3# # busca los caracteres alfanum<ricos [!caracteres busca los caracteres #ue N) 'ertenecen al rango7 Ata*os 'ara los rangos!
atajo rango
J4 JR Js JS
5nidades de +esteo
El testeo de unidades es un m todo 'ara testear el cdigo en 'e#ueEos tro1os7
6or 3u%
Signi0ica #ue nunca tendr%s el 'roblema de crear un error mientras solucionas otro7 Signi0ica #ue no tendr%s #ue e*ecutar tu 'rograma y *ugar con l 9lo #ue es lento: 'ara arreglar los errores7 El testeo de unidades es muc,o m%s r%'ido #ue el Ttesteo manualT7 (onociendo cmo usar las unidades de test6 abre el mundo al driven development7
Re3uisitos
(argar la biblioteca 5test-unit5 /acer #ue la clase a testear sea una subclase de Test''=nit''TestLase Escribir los m todos con el 're0i*o test) A0irmar 9assert: las cosas #ue decidas #ue sean ciertas7 E*ecutar los tests y corregir los errores ,asta #ue desa'are1can7
reMuire 'test#unit' class Hi7rimerTest & Test''=nit''TestLase def test)de)verdad assert true end end