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.