You are on page 1of 31

Introduccin a Ruby

Introduccin
Ruby es un lenguaje interpretado, orientado a objetos creado por Yukihiro Matsumoto (Matz), 1995 !ltima "ersi#n estable 1 9 1, 11$%&$&%%9 'odos los tipos de datos son un objeto, incluidas las clases, tipos primiti"os
GSyC 2009

*os comentarios comienzan por +,+ -tra .orma) /begin c#digo comentado /end

Primer programa
# Programa en ruby puts'Hola Ruby' x=1 puts(x)
0ada instrucci#n se escribe en una l1nea di.erente, no es necesario +2+

3o es necesario declarar "ariables antes de usarlas Declaracin implcita de variables.

3o se de.ine +main+ o blo4ue principal

(l resultado de ejecutar este programa es) hola Ruby 1


GSyC 2009

5e pueden omitir los par6ntesis en las llamadas a .unciones, si no hay ambig7edad

Primer programa
8eclaraci#n de una .unci#n

9n"ocaci#n de la .unci#n hola

# Programa en ruby def hola(nombre) puts "hola #{nombre}" end hola('Ruby') x=1 puts(x)
(l resultado de ejecutar este programa es) hola Ruby 1
GSyC 2009

*a comilla simple y las dobles comillas tienen signi.icado di.erente

5ustituci#n de la "ariable

Ejecucin de un programa en Ruby


(jecutar ruby cargando el .ichero del programa
! ruby "# $f%lename!

(jecutar el int6rprete interacti"o (irb) e introducir sentencias por la entrada est:ndar


! %rb !! &'& =! (
;rompt de irb
Muestra el "alor de retorno de cada sentencia

(jecutar un script de ruby


! )*m%Programa)rb
GSyC 2009

Script de Ruby
<n script de ruby debe comenzar con una primera l1nea 4ue indi4ue d#nde se encuentra el int6rprete de ruby)
#+*usr*b%n*ruby "# #Programa en ruby def hola(nombre) puts "hola #{nombre}" end hola('Ruby') =ichero m%Programa)rb

(l .ichero debe ser ejecutable 3o es muy portable ya 4ue depende del directorio donde se haya instalado ruby
GSyC 2009

Ayuda ri
Re.erencia interacti"a) herramienta 4ue muestra descripciones de los m6todos, clases y m#dulos prede.inidos en Ruby
! r% ,tr%ng)-ap%tal%.e """""""""""""""""""""""""""""""""""""""""""""""""""""" ,tr%ng#-ap%tal%.e str)-ap%tal%.e =! ne#/str """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" Returns a -opy of /str/ #%th the f%rst -hara-ter -on0erted to upper-ase and the rema%nder to lo#er-ase) "hello")-ap%tal%.e "H1223")-ap%tal%.e "1&4567")-ap%tal%.e #=! "Hello" #=! "Hello" #=! "1&4ab-"

GSyC 2009

Valor de retorno de una uncin


(l "alor de retorno de una .unci#n es el "alor de la >ltima e?presi#n ejecutada *os siguientes ejemplos son e4ui"alentes)
def saludo(nombre) res = "6uenos d8as9 #{nombre}" return res end puts saludo('5l%-%a') def saludo(nombre) "6uenos d8as9 #{nombre}" end

puts saludo('5l%-%a')

GSyC 2009

Asignaciones especiales
(n Ruby casi cual4uier cosa de"uel"e un "alor @s1, pueden encadenarse asignaciones)
a = b = - = (:

@signaci#n paralela)
a9 b = b9 a # %nter-amb%a a y b

(?isten las asignaciones con atajos de 0)


a '= & # %n-rementa a en &
GSyC 2009

(no e?isten los operadores AA y BB)

Identi icadores
Cariables locales, nombres de m6todos y par:metros de m6todos comienzan por letra min>scula o por D)
; l%sta9 n/max%mo9 num

Cariables globales comienzan por E)


; <-ount9 <1

Cariables de instancia comienzan por F)


; =nombre9 =edad9 =n/dn%

Cariables de clase comienzan por FF)


; ==%nstan-%a9 ==tabla

3ombres de clases, m#dulos y constantes comienzan por letra may>scula)


; >%7lase9 ,tr%ng9 ?%xnum9 ; >5@/AB>9 >CA/AB>
GSyC 2009

10

Ejercicio
(j1) Realiza un programa en Ruby 4ue de.ina una .unci#n cuyo "alor de retorno sea una cadena de caracteres similar a)
G (l producto de ? por y es z

8onde ? e y pueden ser "alores cuales4uiera 4ue se le pasan a la .unci#n como par:metros y z/?Hy (l programa calcular: el producto de los n>meros 5 y I e imprimir: la cadena de caracteres) +(l producto de 5 por I es J%+

GSyC 2009

11

Arrays
0olecci#n de re.erencias a objetos inde?ados por un entero (l 1ndice del primer elemento es %
G *iteral)
a = D19 '-at'9 4)1(E # aDFE=1: aD1E="-at": aD&E=4)1( a = D'uno'9 'dos'9 'tres'E # aDFE="uno": aD1E="dos": aD&E="tres" a = G#(uno dos tres) # G#H array de palabras

G 0rear array y aKadir elementos)


a = 5rray)ne# a $$ 1 $$ '-at' $$ 4)1(
# aDFE=1: aD1E="-at": aD&E=4)1(

G 0rear un array de cierto tamaKo cuyas posiciones est:n incializadas como re.erencias a un cierto objeto
a = 5rray)ne#(1F9 'aa') aDFE$$ 'b'
# aDFE="aa": aD1E="aa": I : aDJE="aa" # aDFE="aab": aD1E="aab": I : aDJE="aab"

GSyC 2009

12

Ejemplos con arrays


a = D4)1(9 "hola"9 1E a)-lass a)length aDFE aD1E aD&E aD4E aD"1E b = D19 49 K9 L9 JE bD1))4E bD1)))4E bD4))4E bD"4))"1E
ndices positivos -> 0 -3 1 -2 2 -1 <- ndices neg tivos 13

=! =! =! =! =! =! =! =! =! =! =! =! =!

D4)1(9 5rray 4 4)1( "hola" 1 n%l 1 D19 49 D49 K9 D49 KE DLE DK9 L9

"hola"9 1E

K9 L9 JE LE

JE

a=

4)1(

"hola"

GSyC 2009

Pilas y !olas con arrays


p%la = 5rray)ne#() p%la)push('a') p%la)push('b') p%la)push('-') pr%nt p%la)pop unt%l p%la)emptyM

# p%la = D"a"9 "b"9 "-"E # %mpr%me -ba

-ola = 5rray)ne#() -ola)push('a') -ola)push('b') -ola)push('-') pr%nt -ola)sh%ft unt%l -ola)emptyM

# -ola = D"a"9 "b"9 "-"E # %mpr%me ab-

GSyC 2009

14

Array"join y String"split
D"a"9 "b"9 "-"E)No%n D"a"9 "b"9 "-"E)No%n(" ") D"a"9 "b"9 "-"E)No%n(""") D"a"9 "b"9 "-"E)No%n(""O"") D19 &9 4E)No%n D19 &9 49 "hola"E)No%n "hola a todos")spl%t "1&*11*&FFP")spl%t("*") =! =! =! =! =! =! "ab-" "a b -" "a"b"-" "a"O"b"O"-" "1&4" "1&4hola"

=! D"hola"9 "a"9 "todos"E =! D"1&"9 "11"9 "&FFP"E

GSyC 2009

15

#as$
5imilar a un array, se puede utilizar cual4uier objeto como 1ndice o cla"e
h = {'uno' =! 19 'dos' =! &9 'tres' =! 4} puts hD'uno'E puts hD'dos'E puts hD'tres'E # Cmpr%me 1 # Cmpr%me & # Cmpr%me 4

*os 1ndices$cla"es de un hash deben ser >nicos


G 3o puede haber dos "alores di.erentes para
hD'uno'E

<n hash de"uel"e n%l cuando se utiliza un 1ndice para el 4ue no se ha de.inido un "alor en ese hash <n array es m:s e.iciente 4ue un hash, pero un hash permite mayor .le?ibilidad
GSyC 2009

16

Ejecucin condicional
9=
%f a$1F then x= 'menor Que 1F' els%f a!=1F and a$=&F then x='entre 1F y &F' else x='mayor Que &F' end x = %f a$1F then 'menor els%f a!=1F and 'entre else 'mayor end Que 1F' a$=&F then 1F y &F' Que &F'

%f de"uel"e el "alor de la >ltima e?presi#n ejecutada la palabra then solo es obligatoria si el %f se escribe en una sola l1nea la palabra then puede sustituirse (si se 4uiere) por el car:cter H <na condici#n es cierta si su e"aluaci#n es cual4uier cosa sal"o false o n%l (objeto 4ue representa +nada+) G (l "alor % no es false, es m:s, es true (LsorpesaM) ; ; ; G

<3*(55) si no se cumple la condici#nN


unless a$1 then x='mayor o %gual Que 1' else x='menor Que 1' end

GSyC 2009

17

if y unless como modi icadores


*a e?presi#n anterior al modi.icador %f es e"aluada si la condici#n es cierta)
x='mayor o %gual Que 1' %f a!=1

*a e?presi#n anterior al modi.icador unless es e"aluada si la condici#n es .alsa)


x='mayor o %gual Que 1' unless a$1

GSyC 2009

18

Ejecucin condicional con case


0@5()
G *a condici#n se comprueba utilizando el operador === 4ue tiene signi.icado di.erente seg>n el tipo de objeto 4ue se use con -ase
O ;ara e?presiones regulares) b>s4ueda de patrones

G *a cl:usula else) si no se cumple alguna de las condiciones anteriores G *as cl:usulas #hen pueden lle"ar o no al .inal then o H (como el i.)
x = -ase % #hen 19 &))K then puts "menor Que #hen R))1F then puts "mayor Que -ase str #hen 'aaa'9 'bbb' puts 'aaa or bbb' #hen *def* puts "%n-luye *def*" else puts "7ualQu%er -osa" end 19

R"

R" end

GSyC 2009

%ucles
PQ9*(
#h%le l%ne = gets # I end beg%n # I end #h%le l%ne = gets

<3'9*
unt%l not (l%ne = gets) # I end beg%n # I end unt%l -$1FF

=-R)

(en realidad es otra .orma de escribir el iterador ea-h)


for % %n G#(a b -) puts "#{%}" end

for % %n 1))1F puts "#{%}" end

Modi.icadores)
- = & #h%le - $ 1FFF - = - O end - = & - = - O- #h%le - $ 1FFF
GSyC 2009

20

E&presiones regulares
=orma de especi.icar un patr#n de caracteres 4ue se encuentra en una cadena) $patr#n$ @bre"iaturas para clases de caracteres)
Sd SV Ss S, S# SX -ualQu%er -arT-ter -ualQu%er -arT-ter -ualQu%er -arT-ter -ualQu%er -arT-ter -ualQu%er -arT-ter m%nWs-ulas) -ualQu%er -arT-ter numUr%-o del F al J ex-epto los numUr%-os del F al J "#h%tespa-e" (blan-o9 tabulador9 f%n de l8nea9 f%n de f%-hero ex-epto los "#h%tespa-e" prop%o de una palabra (letras y nWmeros9 mayWs-ulas sal0o los prop%os de una palabra

(jemplos)
*PerlYPython* *P(erlYython)* *SdSdHSdSdHSdSd* *Perl OPython* *Perl 'Python* # "Perl" o "Python" # "Perl" o "Python" # ddHddHdd9 eNH 1&H&4H(K # "Perl" F Z mTs espa-%os "Python" # "Perl" 1 Z mTs espa-%os "Python"

GSyC 2009

21

E&presiones regulares
-perador de b>s4ueda de una patr#n) =
G Rusca un determinado patr#n en una cadena de caracteres 8e"uel"e la posici#n donde lo encuentra o nil G (jemplo, l%ne es una cadena)
%f l%ne = *PerlYPython* puts "2enguaNe #{l%ne}" end

(?traer patrones)
*()O) ()O)* = D<19 <&E "hola ruby" =! F =! D"hola"9 "ruby"E =! *nombreH"()O)"* =! #$>at-hVataHFx(F&-1f-F! =! "ruby"

re = *nombreH"()O)"* mr = re)mat-h('nombreH "ruby"') mrD1E

GSyC 2009

22

E&presiones regulares y sustituciones


(l patr#n encontrado en una cadena de caracteres puede ser sustituido utilizando m6todos de sustituci#n 5uponiendo 4ue l%ne contiene una cadena de caracteres)
G 5ustituye la primera "ez 4ue se encuentre S;erlS en la "ariable line por SRubyS)
l%ne)sub(*Perl*9 'Ruby')

G 5ustituye todas las apariciones de +;erl+ en la "ariable line por SRubyS)


l%ne)gsub(*Perl*9 'Ruby')
23

GSyC 2009

%lo'ues
<n blo4ue es un conjunto de instrucciones 4ue puede asociarse a una llamada de un m6todo, como si .uera un par:metro <n blo4ue se de.ine entre lla"es o entre las palabras reser"adas doIend
C! ndo e" #es!"t do es i$po#t nte

{ %f x!F then x else F }

do puts "hola" puts "esto es un bloQue" end

C! ndo e" e%ecto " te# " es i$po#t nte

;ara asociar un blo4ue a un m6todo, el blo4ue se escribe a continuaci#n de la llamada al m6todo (despu6s de los par:metros 4ue hubiera 4ue pasar al m6todo) 8entro de un m6todo se utiliza la instrucci#n y%eld para ejecutar el blo4ue asociado al m6todo *os blo4ues pueden tener sus propios argumentos, 4ue se pasar:n en el y%eld
GSyC 2009

24

Ejemplo de blo'ue
)*ec!t e" '"o(!e soci do " $+todo llama/al/bloQue

def llama/al/bloQue puts "7om%en.a el mUtodo" y%eld y%eld puts "?%n del mUtodo" end llama/al/bloQue {puts "6loQue"}

,"o(!e soci do " $+todo llama/al/bloQue

def llama/al/bloQue puts "7om%en.a el mUtodo" y%eld("hola"94) puts "?%n del mUtodo" end

llama/al/bloQue {Ystr9 numY puts "6loQue str=#{str} num=#{num}"}


)*ec!t e" '"o(!e soci do " $+todo llama/al/bloQue pas:ndole los argumentos ,"o(!e soci do " $+todo llama/al/bloQue GSyC 2009

&#g!$entos de" '"o(!e

25

Iteradores
M6todos 4ue de"uel"en sucesi"amente elementos pertenecientes a una colecci#n, por ejemplo, un array o un rango de n>meros - #i '"e "oc " (!e to$
%o# i in ni$ "es do p!ts i end

an%males = G#(perro gato -aballo) an%males)ea-h {Y an%mal Y puts an%mal }

e" v "o# de c d e"e$ento de !n co"ecci.n con c d ite# ci.n/

(n pseudoc#digo, ea-h estar: implementado de la siguiente .orma)


# dentro de la clase Array def each for each element yield(element) end end

GSyC 2009

26

Ejemplos de iteradores
D'yo'9 'soy'9 'un'9 'plTtano'E)each do YentryY pr%nt entry9 ' ' end fa-=1 1)upto(K) do Y%Y fa-O=% end fa=! 1 =! 1&F

D19 &9 49 (9 KE)map {YentryY entryOentry }

=! D19 (9 J9 1R9 &KE

2ev!e"ve !n n!evo ## y desp!+s de ite# # so'#e "os e"e$entos de" ## y y e*ec!t # e" '"o(!e con c d !no de e""os/

(l resultado de un blo4ue puede utilizarlo el 4ue llama a dicho blo4ue


(F))1FF))inject(F) { Yresult9 entryY result ' entry }=! KFKF
#es!"t " p#i$e# ve0 v "e 0 y " s sig!ientes veces es e" #es!"t do de " e*ec!ci.n de" '"o(!e/ ent#y es e" e"e$ento i-+si$o de " co"ecci.n en c d ite# ci.n Si se o$ite e" #g!$ento de" in*ect1 #es!"t " p#i$e# ve0 es e" p#i$e# e"e$ento de " co"ecci.n1 y se v ite# ndo con "os e"e$entos p #ti# de" seg!ndo GSyC 2009

27

()s ejemplos
3te# ci.n ent#e ente#os desde 0 n-1

()times do Y%Y puts %O=& end 4)upto(R) {Y%Y pr%nt % } ('a')) 'e'))each {Y-harY pr%nt -har } a=G#(a b -) a)collect {YxY x)su-- } a
4is$ %!ncion "id d (!e $ p

=! D"a"9 "b"9 "-"E =! D"b"9 "-"9 "d"E =! D"a"9 "b"9 "-"E =! D"a"9 "b"9 "-"E =! D"5"9 "6"9 "7"E =! D"5"9 "6"9 "7"E

a=G#(a b -) a)collect! {YxY x)up-ase } a

)" 6 3ndic (!e se $odi%ic " v #i '"e

con e" #es!"t do de e*ec!t # co""ect

(F))1FF))inject { Yresult9 entryY result ' entry }=! KFKF


Sin #g!$entos5 " p#i$e# ve0 (!e se e*ec!t e" '"o(!e1 #es!"t to$ e" v "o# de" p#i$e# e"e$ento de " co"ecci.n y ent#y e" v "o# de" seg!ndo/ )n e" $is$o e*e$p"o donde se "e p s !n v "o# po# de%ecto #es!"t1 e" '"o(!e se e*ec!t n veces/ )n este e*e$p"o e" '"o(!e se e*ec!t n-1 veces GSyC 2009

28

()s ejemplos
: s # !n '"o(!e co$o p #;$et#o de !n %!nci.n
def f(-ount9 [blo-\) 0alue = 1 1)upto(-ount) do Y%Y 0alue = 0alue O% blo-\)-all(%9 0alue) end end f K do Y%9 f/%Y puts "f(#{%})= #{f/%}" end )*ec!t e" '"o(!e blo-\

%718 9 1 %728 9 2 %738 9 6 %748 9 24 %758 9120

def f(-ount) 0alue = 1 1)upto(-ount) do Y%Y 0alue = 0alue O% y%eld(%9 0alue) end end f(K) do Y%9 f/%Y puts "f(#{%})= #{f/%}" end
GSyC 2009

29

Ejercicios
(j&) (scribe una .unci#n iterador n/t%mes (!e "" $e '"o(!e n veces/
def n/t%mes(n) # I end

!n

(jJ) <tilizando %nNe-t de un rango de n>meros escribe una .unci#n 4ue calcule nM
def fa-(n) # I end

(jT) (scribe una .unci#n 4ue calcule la cadena m:s larga dentro de un array
def longest/str%ng(array) # I end
GSyC 2009 < "ongit!d de !n c den de c # cte#es p!ede s 'e#se !ti"i0 ndo5 a="hola" a)length

30

!lases y *bjetos
*os nombres de clases comienzan con la primera letra en may>scula (l m6todo ne# crea un nue"o objeto de una determinada clase
s=,tr%ng)ne#

'odas las clases heredan de la clase 3bNe-t (n ruby todo son objetos y por tanto, pueden in"ocarse sus m6todos de la siguiente .orma) obNeto)metodo
G *os hemos estado usando)
] l%ne)gsub(I)9 1)upto(4)9 x)up-ase

Ruby dispone de un recolector de basura 4ue se encarga de destruir los objetos cuando ya no se usan
GSyC 2009

31

Ejemplos de objetos
(()R))round (()R))-lass (()R))round)-lass "()-lass 'hola')length 'hola')-lass 'hola')gsub('h'9 'm') D'esto'9 'es'9 'un'9 'array'E)length =! =! =! =! K ?loat ?%xnum ?%xnum

=! ( =! ,tr%ng =! "mola" =! (

(())'(4) =! L # 1n algunos -asos9 nota-%Zn %nf%Na (a.W-ar s%ntT-t%-o) ( ' 4 =! L


32

GSyC 2009

!lases y objetos
(n algunos lenguajes de programaci#n orientados a objetos)
G *os objetos son datos G *as clases son tipos de datos

(n ruby las clases tambi6n son objetos de tipo 7lassH


1F)-lass "hola")-lass ?%xnum)-lass ,tr%ng)-lass ?loat)-lass 7lass)-lass
GSyC 2009

=! =! =! =! =! =!

?%xAum ,tr%ng 7lass 7lass 7lass 7lass 33

+as clases tambi,n son objetos


5e pueden utilizar las clases como objetos)
%f a then b=,tr%ng else b=5rray end x= b)ne# # x puede ser un ,tr%ng o un 5rray depend%endo del 0alor de a

5e pueden in"ocar los m6todos de las clases, como se in"ocan los m6todos de los objetos)
,tr%ng)ne# ,tr%ng)methods =! "" =! D"%nspe-t"9 "pr%0ate/-lass/method"9 "-onst/m%ss%ng"9 "-lone"9 "method"9 "publ%-/methods"9 I E
GSyC 2009

34

*as "ariables de clase (atributos est:ticos) comienzan por FF

De inicin de clases y declaracin de objetos


-lass Persona ==numero/personas=F def %n%t%al%.e(nombre9 edad9 0%0a=true) =nombre = nombre =edad = edad =0%0a = 0%0a ==numero/personas '=1 end def saludo ">e llamo #{=nombre} y tengo #{=edad} a^os" end end al%-%a = Persona)ne#('5l%-%a'9 &F) puts al%-%a)saludo
9mprime en la salida est:ndar +Me llamo @licia y tengo &% aKos+ Cariables locales del m6todo Calor por de.ecto 8e.inici#n de la clase Persona (primera letra con may>scula)

0onstructor *as "ariables de instancia comienzan por F M6todo de la clase Persona

Cariable al%-%a 4ue es un nue"o objeto de la clase Persona 5e construye llamando a %n%t%al%.e de Persona

GSyC 2009

35

sel
8entro de un m6todo de una clase self es una re.erencia al objeto sobre el 4ue dicho m6todo se ha in"ocado self puede utilizarse para in"ocar otros m6todos, pero no para in"ocar atributos Muchas "eces utilizar self es redundante
-lass Persona ))) def nue0o/saludo/1 ",aludo 1H " ' saludo end def nue0o/saludo/& ",aludo &H " ' self)saludo end end
GSyC 2009

36

#erencia
*a clase >uNer hereda de la clase Persona) (s una especializaci#n de Persona)

-lass >uNer $ Persona def %n%t%al%.e (nombre9 edad9 n/partos9 0%0a=true) super(nombre9 edad9 0%0a) =n/partos = n/partos end end puts >uNer)ne#("V%ana"9 &&9 F))saludo m = >uNer)ne#(">ar%sa"9 (F9 1) m)%nspe-t # de0uel0e el %d del obNeto # y las 0ar%ables de %nstan-%a

5e in"oca dentro de un m6todo para ejecutar el m6todo del mismo nombre en la clase padre (n este caso se llama al constructor de Persona 0rea un objeto de tipo >uNer e imprime en la salida est:ndar +Me llamo 8iana y tengo && aKos+

#$>uNerHFx&(dL( =edad=(F9 =nombre=">ar%sa"9 =n/partos=19 =0%0a=true! GSyC 2009

37

Sobrecarga de m,todos
Ruby no permite la sobrecarga de m6todos)
G <na clase no puede tener dos m6todos con el mismo nombre y di.erente n>mero de par:metros 5i los tiene, s#lo ser: ":lido el >ltimo 4ue tenga de.inido G 5#lo puede e?istir un constructor por clase

GSyC 2009

38

(,todos de clase
=uncionan sin necesidad de ser in"ocados a partir de una determinada instancia
G M6todo neU) persona= Persona)ne# G M6todo para borrar un .ichero) ?%le)delete("nombre")
8e.inici#n de un m6todo de clase -tras .ormas de de.inir m6todos de clase

-lass 1Nemplo def metodo/de/%nstan-%a end def 1Nemplo)metodo/de/-lase end end

-lass 1Nemplo def self)metodo/de/-lase end -lass $$self def metodo/de/-lase end end
end

GSyC 2009

39

*bjetos y atributos
*os atributos de una instancia del objeto ;ersona son pri"ados y s#lo los m6todos de una instancia tienen acceso a ellos ;ara 4ue una instancia pueda mostrar el contenido de sus atributos es necesario de.inir
G M6todos 4ue muestren el "alor de los atributos
-lass Persona def %n%t%al%.e(nombre9 edad9 0%0a=true) =nombre9 =edad9 =0%0a = nombre9 edad9 0%0a 8e.iniciones e4ui"alentes end def nombre =nombre -lass Persona end attr/reader Hnombre9 Hedad9 H0%0a def edad def %n%t%al%.e(nombre9 edad9 0%0a=true) =edad =nombre9 =edad9 =0%0a = nombre9 edad9 0%0a end end def 0%0a end =0%0a end end 40
GSyC 2009

*bjetos y atributos
;ara 4ue una instancia pueda modi.icar el contenido de sus atributos desde .uera de los m6todos de dicha instancia, es necesario de.inir
G M6todos 4ue modi.i4uen el "alor de los atributos
-lass Persona def %n%t%al%.e(nombre9 edad9 0%0a=true) =nombre9 =edad9 =0%0a = nombre9 edad9 0%0a end 8e.iniciones e4ui"alentes def edad=(nue0a) =edad=nue0a end -lass Persona end attr/#r%ter Hedad def %n%t%al%.e(nombre9 edad9 0%0a=true) =nombre9 =edad9 =0%0a = nombre9 edad9 0%0a end end

GSyC 2009

41

Ejemplo
-lass Persona attr/#r%ter Hedad attr/reader Hnombre9 Hedad9 H0%0a def %n%t%al%.e(nombre9 edad9 0%0a=true) =nombre9 =edad9 =0%0a = nombre9 edad9 0%0a end end p=Persona)ne#("dan%el"9 &) puts "1l nombre es #{p)nombre}" p)edad '=1 puts "#{p)nombre} t%ene #{p)edad} a^os"

GSyC 2009

42

*bjetos y atributos
0rear .unciones de lectura y modi.icaci#n para los atributos de una clase)
-lass Persona attr/a--essor Hnombre9 Hedad9 H0%0a def %n%t%al%.e(nombre9 edad9 0%0a=true) =nombre9 =edad9 =0%0a = nombre9 edad9 0%0a end end

GSyC 2009

43

Smbolos
(s un objeto 4ue puede ser representado por un n>mero o por una cadena de caracteres
; Hab- es un objeto 5ymbol y se interpreta como +la cosa llamada abc+

5#lo e?iste un >nico s1mbolo asociado a un determinado nombre


G 5i en un c#digo se hace re.erencia "arias "eces a Hab-, se est: haciendo re.erencia siempre al mismo objeto G <n s1mbolo 3- es un 5tring)
puts puts puts puts puts puts "hola")-lass Hhola)-lass "hola")obNe-t/%d "hola")obNe-t/%d Hhola)obNe-t/%d Hhola)obNe-t/%d =! =! =! =! =! =! ,tr%ng ,ymbol 1L(KP& 1LFFP& 4J14JJP 4J14JJP

5e utilizan para representar nombres y cadenas de caracteres *os s1mbolos ahorran memoria y tiempo
G ;ara crear una tabla hash)
] h= {Hnombre =! "Pepe"9 Hema%l =! "pepe=gsy-)es"}

G 3ombre de "ariable, m6todo, constante


] attr/reader Hnombre
GSyC 2009

44

!ontrol de acceso
(n Ruby la >nica .orma de cambiar el estado de un objeto es a tra"6s de sus m6todos 0ontrolando el acceso a los m6todos, se controla el acceso al estado del objeto (?isten J ni"eles de protecci#n)
G (,todos p-blicos) cual4uiera puede llamarlos ;or de.ecto son todos p>blicos (sal"o %n%t%al%.e) G (,todos protegidos) s#lo pueden llamarlos los objetos de la clase de.inida y sus subclases (l acceso 4ueda controlado dentro de esa .amilia de objetos G (,todos privados) s#lo los puede in"ocar el propio objeto 3o se puede llamar a los m6todos pri"ados de otro objeto, incluso si el objeto 4ue los llama es de la misma clase 4ue el otro objeto ;or ello, s#lo se permite in"ocar un m6todo pri"ado en la .orma m()))) y no en la .orma o)m()))), para ning>n o (Lni si4uiera selfM)
GSyC 2009

45

Especi icar el control de acceso


-lass >%7lase def metodo1 # I end prote-ted def metodo& # I end pr%0ate def metodo4 # I end publ%def metodo( # I end end -lass >%7lase def metodo1 # I end def metodo& # I end def metodo4 # I end def metodo( # I end publ%Hmetodo19 Hmetodo( prote-ted Hmetodo& pr%0ate Hmetodo4 end
GSyC 2009

46

Ejemplo
-lass Persona def nombre '>ar%sa' end def apell%do '2ope.' end def nombre/-ompleto -onstruye/nombre end def -onstruye/nombre nombre ' " " ' apell%do end

p = Persona)ne# puts p)nombre puts p)apell%do puts p)nombre/-ompleto puts p)-onstruye/nombre

prote-ted pr%0ate end

Hnombre/-ompleto H-onstruye/nombre 47

GSyC 2009

Ejemplo
-lass Persona def nombre '>ar%sa' end def apell%do '2ope.' end end prote-ted def nombre/-ompleto -onstruye/nombre end pr%0ate def -onstruye/nombre nombre ' " " ' apell%do end end 48
Persona5--Publ%-o tiene los mismos m6todos de Persona por4ue los ha heredado ;ermite 4ue se ejecute nombre/-ompleto a tra"6s del m6todo p>blico nombre/-ompleto/publ%-o ;ermite 4ue se ejecute -onstruye/nombre a tra"6s del m6todo p>blico -onstruye/nombre/publ%-o

-lass Persona5--Publ%-o $ Persona def nombre/-ompleto/publ%-o self)nombre/-ompleto end def -onstruye/nombre/publ%-o -onstruye/nombre end

p = Persona5--Publ%-o)ne# puts p)nombre/-ompleto/publ%-o puts p)-onstruye/nombre/publ%-o

GSyC 2009

Ejemplo
-lass Persona def nombre '>ar%sa' end def apell%do '2ope.' end end prote-ted def nombre/-ompleto -onstruye/nombre end pr%0ate def -onstruye/nombre nombre ' " " ' apell%do end end 49
;or ser un m6todo pri"ado, no puede in"ocarse sobre ning>n objeto (Lni si4uiera selfM)

-lass Persona5--Publ%-o $ Persona def nombre/-ompleto/publ%-o self)nombre/-ompleto end def -onstruye/nombre/publ%-o self.-onstruye/nombre end

p = Persona5--Publ%-o)ne# puts p)nombre/-ompleto/publ%-o puts p)-onstruye/nombre/publ%-o

GSyC 2009

-lass Persona def nombre '>ar%sa' end def apell%do '2ope.' end prote-ted def nombre/-ompleto -onstruye/nombre end

Ejemplo

pr%0ate def -onstruye/nombre nombre ' " " ' apell%do end

p = Persona)ne# p)%gual/aM(Persona)ne#)

publ%def %gual/aM(otro) self)nombre/-ompleto)eQlM(otro)nombre/-ompleto) end end


GSyC 2009

nombre/-ompleto es un m6todo protegido y por tanto puede ser llamado desde los objetos de la clase en la 4ue est: de.inido y de las clases hijas

50

.-mero variable de argumentos


9ndica n>mero "ariable de argumentos y captura un conjunto de argumentos como un >nico par:metro de tipo 5rray

-lass Vatos def %n%t%al%.e(arg19 Ol%st) puts "5rg1=#{arg1}" puts "2%sta long%tud=#{l%st)length}" puts l%st end end d1 = Vatos)ne#("dato1") d& = Vatos)ne#("dato1"9 "dato&") d4 = Vatos)ne#("dato1"9 "dato&"9 "dato4")

5rg1=dato1 2%sta long%tud=F 5rg1=dato1 2%sta long%tud=1 dato& 5rg1=dato1 2%sta long%tud=& dato& dato4

GSyC 2009

51

*bjetos y variables
<na "ariable no es un objeto <na "ariable es una re.erencia a un objeto St#ing
person1 = "_%m" person& = person1 person1DFE='`' person1 person& =! "`%m" =! "`%m"

=>i$=

person1

person&

GSyC 2009

52

El objeto nil
(l objeto n%l es de la clase A%l7lass Ruby utiliza este "alor para asignarlo a los campos sin inicializar de una clase

GSyC 2009

53

Argumentos de la lnea de comandos


*os argumentos de la l1nea de comandos (despu6s del nombre del programa) se guardan en un array de cadenas de caracteres en 5Rab
G ;ara con"ertir un argumento a un n>mero es necesario usar to/%)
] 5RabDFE)to/%

G (l nombre del programa se encuentra en la "ariable global E%


puts "AWmero de argumentos #{5Rab)length}" 5Rba)ea-h { Y%Y puts "5rgumento #{%}" } puts "Aombre del programa #{<F}"

GSyC 2009

54

E&cepciones
<n c#digo bien programado debe anticiparse a los errores, en Ruby, utilizando las e?cepciones Ruby prede.ine una jerar4u1a de e?cepciones a partir de la clase 1x-ept%on (l usuario puede lanzar una de las e?cepciones ya de.inidas en Ruby o crear las suyas propias 5i un usuario 4uiere de.inir sus propias e?cepciones, 6stas deber1an heredar de ,tandard1rror o alguna de sus clases hijas para 4ue por de.ecto se capturen <na e?cepci#n tiene asociado un mensaje (cadena de caracteres) y la traza de llamadas (backtrace)

GSyC 2009

55

!apturar e&cepciones
beg%n # las ex-ep-%ones lan.adas por este -Zd%go # serTn -apturadas por la s%gu%ente %nstru--%Zn res-ue # I # I # I res-ue 1x-ept%on7lass59 1x-ept%on7lass6 =! e1 # se eNe-uta s% el -Zd%go lan.a una 1x-ept%on7lass5 # o 1x-ept%on7lass6 # e1 toma el 0alor de la ex-ep-%Zn Que se ha lan.ado res-ue 1x-ept%on7lass7 =! e& # se eNe-uta s% el -Zd%go lan.a una 1x-ept%on7lass7 # e& toma el 0alor de la ex-ep-%Zn Que se ha lan.ado res-ue # -aptura una ex-ep-%Zn ,tandard1rror ensure # -Zd%go Que siempre se eNe-uta end
GSyC 2009

56

+an/ar e&cepciones
beg%n # I # I # I ra%se # # ra%se # # ra%se # # end

Relan.a de nue0o la m%sma ex-ep-%Zn (o Runt%me1rror s% no se hab8a lan.ado hasta ahora n%nguna ex-ep-%Zn) ",er0%dor -a8do" 7rea una ex-ep-%Zn Runt%me1rror -on el mensaNe ",er0%dor -a8do" y la lan.a 1,er0erVo#n9 "1l ser0%dor no responde" -rea una ex-ep-%Zn de t%po 1,er0erVo#n y le aso-%a el mensaNe "1l ser0%dor no responde"

GSyC 2009

57

GSyC 2009
Del libro Pragmatic Bookshelf - Programming Ruby

58

Algunas e&cepciones $abituales

2e" "i'#o ?!'y %o# ? i"s GSyC 2009

59

Ejemplo
-lass >%1x-ep-%on $ 1x-ept%on: end -lass >%1x-ep-%onH%Na $ >%1x-ep-%on: end -lass >%3tra1x-ep-%onH%Na $ >%1x-ep-%on: end def prueba1x-ep-%ones beg%n puts "Prueba a lan.ar >%3tra1x-ep-%onH%Na" ra%se >%3tra1x-ep-%onH%Na puts "no deber%a %mpr%m%rse" res-ue >%1x-ep-%onH%Na puts "7apturada m% ex-ep-%on h%Na" ra%se res-ue >%3tra1x-ep-%onH%Na puts "7apturada m% otra ex-ep-%on h%Na" ra%se end end beg%n prueba1x-ep-%ones res-ue >%1x-ep-%on =! e puts "#{e} ha o-urr%do" puts "Por fa0or9 -onta-ta -on el adm%n%strador del s%stema H)" GSyC 2009 end

60

Incluir ic$eros
(s .recuente "er una organizaci#n del c#digo Ruby en di.erentes .icheros, por ejemplo di"idiendo las clases de.inidas en .icheros distintos ;ara poder usar las clases de.inidas en otros .icheros, es necesario utiliza la instrucci#n reQu%re
reQu%re 'nombre?%-hero'

*as "ariables locales no se propagan al :mbito desde donde se in"oca reQu%re


GSyC 2009

61

Ejemplo0 require
@icAe#o %1/#'
a=1 def b & end

@icAe#o %2/#'
a="gato" reQu%re 'f1' puts a puts b
(scribe) gato &

*as "ariables locales no se propagan con reQu%re

GSyC 2009

62