Tot és un objecte, cal anar acostumbrant-se per utilizar la notació del `.mètode.
(5.6).round # 6
(5.6).class # Float
(5.6).round.class # Integer
`un string`.length # 9
`un string`.class # String
`pepe diu.gsub('p', 't') # 'tete diu'
'abc'.gsub('b','xxx').length # 5 ha cambiat la `b` per `xxx`
['algunes', 'coses', 'array'].length # 3
['algunes', 'coses', 'array'].reverse # ["array", "coses", "algunes"]
# A l'ésser un objecte, el mètode suma és:
1.+(2) # 3
# però per aquests casos hi ha un sucre sintàctic:
1 + 2 # 3
Definició de classes
class Persona
def initialize(nombre)
@nombre = nombre
end
def saludar
"Hola, el meu nom és #{@nombre}."
end
end
pepe = Person.new('Pep')
puts pepe.saludar # Hola, el meu nom és Pep
Herència de classes
class Matz < Persona
def initialize
super('Yukihiro Matsumoto')
end
end
Accesors
Els accessors són funcions que permeten l’accés als atributs d’un objecte.
class Perro
def initialize(nombre, raza)
@nombre = nombre
@raza = raza
end
# per llegir les propietats d'un objecte
def nombre
@nombre
end
def raza
@raza
end
end
perro1 = Pero.new('Trampas', 'palleiro')
perro1 = nombre # Trampas
perro1.raza # palleiro
Això és equivalent a:
class Perro
def initizlize(nombre, raza)
@nombre = nombre
@raza = raza
end
attr_reader :nombre, :raza
end
perro1 = Perro.new('Trampas', 'palleiro')
perro1.nombre # Trampas
perro1.raza # palleiro
accessor | funció |
---|---|
attr_reader | lectura |
attr_writer | escriptura |
attr_accesor | lectura i escriptura |
Classes: extenent les classes
En Ruby les classes mai es consideren tancades, es poden modificar al vol, afegint mètodes, variables…
Per exemple, veiem com afegir una nova funcionalitat a la classe Integer:
class Integer
def fac
raise "Factorització no definida per #{self}" if self < 0
return (1..self).inject(1) {|result,i| result*i}
end
end
puts (0..5).map{|i| i.fac}.join(', ') # 1, 1, 2, 6, 24, 120
Excepcions
La captura es fa mitjançat rescue
previ ús de begin
:
begin
# Codi que pot donar problemes
rescue ClaseEscepcion1 => escepcion1
# S'executa si es llança una ClaseEscepcion1
rescue ClasseEscepcion2 => escepcion2
# S'escecuta si es llança una ClaseExcepcion2
rescue
# Captura qualsevol excepció
ensure
# Codi que sempre s'executa
end
Per a llançar l’excepció, usarem raise
.