Una de les caracerístiques de Ruby és que les classes també són objectes.

La particularitat dels mètodes de classe, en altres llenguatges anomenats mètodes estàtics es que es manen cridar sobre una instància o un objecte de dita classe.

Per exemple, per poder cridar al nostre nom de classe anem a necessitar la classe SoyObjetoLoJuro i el métode nombre_clase.

class SoyObjetoLoJuro
  @nombre_clase = "SoyObjetLoJuro"

  def self.nombre_clase
    @nombre_clase
  end
end

puts SoyObjetoLoJuro.nombre_clase

Output

SoyObjetLoJuro

Cambiem la variable.

class SoyObjetoLoJuro
  @nombre_clase = "SoyObjetLoJuro"

  def self.nombre_clase
    @nombre_clase
  end

  def self.nombre_clase=(nombre_clase)
    @nombre_clase = nombre_clase
  end
end

SoyObjetoLoJuro.nombre_clase="OtraCosa"

puts SoyObjetoLoJuro.nombre_clase

Output

OtraCosa

La particularitat dels que els distinguix dels mètodes pertanyents a l’objecte és que, abans d’ells hi ha una referència a self. Quan posem self i la referència al objecte, el mètode li pertany a la classe.

2. Latra manera de definir mètodes de classe

class SoyObjetoLoJuro
  @nombre_clase = "SoyObjetLoJuro"

  class << self

    def nombre_clase
      @nombre_clase
    end

    def nombre_clase=(nombre_clase)
      @nombre_clase = nombre_clase
    end

  end

end

SoyObjetoLoJuro.nombre_clase="OtraCosa"

puts SoyObjetoLoJuro.nombre_clase

Output

OtraCosa

Quan cal utilitzar mètodes de classe?

Quan la funcionalitat que estàs escrivint no li pertanya a ninguna instància o a cap objecte. Un exemple són els mètodes que s’execute sobre l’activerecords de Rails.

class User
end

User.find()

Ací la funcionalitat no li pertanyiria a l’objecte, ja que no tindria sentit fercrear un usuari per cercar un altre usuari. Tindria sentit cercar el cognom, per exemple. Així aquesta classe no pertanyiria a l’objecte.

Cal diferenciar les variables de classe amb les variables d’instància.