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.
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.
:
class Persondef self.mi_metodo_de_claseputs "Este es un método de clase"endend
Para invocar este método debes hacerlo directamente sobre la clase (fíjate que el prefijo self.
se omite):
Person.mi_metodo_de_clase
Si intentas invocar el método sobre una instancia recibirás un error:
p1 = Person.newp1.mi_metodo_de_clase # error
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:
class Person@@people_count = 0def initialize@@people_count += 1enddef self.people_count@@people_countendend
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:
puts Person.people_count # Imprime 0Person.newputs Person.people_count # Imprime 1Person.newputs Person.people_count # Imprime 2