Métodos y atributos de clase
Hasta ahora, los métodos y atributos de los que hemos hablado están asociados a un objeto. En este capítulo hablaremos sobre métodos y atributos que están asociados a la clase directamente.

Métodos de clase

Un método de clase es muy parecido a un método de instancia, con la diferencia de que el nombre tiene el prefijo self.:
1
class Person
2
def self.mi_metodo_de_clase
3
puts "Este es un método de clase"
4
end
5
end
Copied!
Para invocar este método debes hacerlo directamente sobre la clase (fíjate que el prefijo self. se omite):
1
Person.mi_metodo_de_clase
Copied!
Si intentas invocar el método sobre una instancia recibirás un error:
1
p1 = Person.new
2
p1.mi_metodo_de_clase # error
Copied!

Atributos de clase

Supongamos que necesitamos contar cuántos objetos se crean a partir de la clase Person. Esa información la podríamos almacenar en un atributo de clase. Los atributos de clase se identifican porque utilizan dos @@ en vez de una:
1
class Person
2
@@people_count = 0
3
4
def initialize
5
@@people_count += 1
6
end
7
8
def self.people_count
9
@@people_count
10
end
11
end
Copied!
En este ejemplo estamos inicializando nuestro atributo de clase @@people_count en 0. Cada vez que se cree un objeto de tipo Person se va a invocar el constructor initialize que incrementa @@people_count en 1.
Los atributos de clase no son visibles fuera de la clase. Es por eso que creamos un método de clase people_count que va a retornar @@people_count.
Probemos esta clase a ver si funciona:
1
puts Person.people_count # Imprime 0
2
3
Person.new
4
puts Person.people_count # Imprime 1
5
6
Person.new
7
puts Person.people_count # Imprime 2
Copied!
Last modified 3yr ago