Les variables de classe poden tenir també variables d’instància.
Les variables de classe es distingueixen per tenir@@
abans del nom.
Característiques:
1. Poden ser usades des de mètodes de la classe o des de mètodes de l’objecte.
class Video
@@type = "video/mp4"
def self.type_desde_clase
p @@type
end
def type_desde_objeto
p @@type
end
end
Video.type_desde_clase
Video.new.type_desde_objeto
Output
"video/mp4"
"video/mp4"
Si convertirem les variables en instàncies, amb una @
veiem els resultats:
class Video
@type = "video/mp4"
def self.type_desde_clase
p @type
end
def type_desde_objeto
p @type
end
end
Video.type_desde_clase
Video.new.type_desde_objeto
Output
"video/mp4"
nil
En el primer cas la impressió és exactament la mateixa, però en el segon cas. En el primer cas no n’hi ha diferència entre la instància d’objecte i la de classe.
En el segon cas ha retornat nil
. La raó és que la variable @type
s’està cercant com una variable de l’objecte creat i no com una variable de la classe. Això no passa quan utilitzem les dos arrobes com una variable de classe.
Les variable de classe amb @@
sempre en buscaran en la classe, no importa des d’on es criden.
2. Comportament quan hi ha herència
class Video
@@de_clase = "Classe woo"
@de_instancia = "Instancia yeeei"
end
class YouTube < Video
def self.test
p @@de_clase
p @de_instancia
end
end
YouTube.test
Output
"Classe woo"
nil
La variable de classe @@de_clase
s’ha heretat, mentre que la variable d’instància @de_instancia
soles li pertany a la classe Video.
Si incloem el mètode en la classe Video:
class Video
@@de_clase = "Classe woo"
@de_instancia = "Instancia yeeei"
def self.test
p @@de_clase
p @de_instancia
end
end
class YouTube < Video
def self.test
p @@de_clase
p @de_instancia
end
end
Video.test
YouTube.test
Així el Video
sí té accés tant a la variable d’instància com de classe, metre que la classe filla sols hereta les variables de classe.
Si canviem una classe padre es veurà reflectit en una classe filla.
class Video
@@de_clase = "Classe woo"
@de_instancia = "Instancia yeeei"
def self.test
p @@de_clase
p @de_instancia
end
end
class YouTube < Video
def self.test
@@de_clase = "Clase cambiada :)"
p @@de_clase
p @de_instancia
end
end
YouTube.test
Video.test
Output
"Clase cambiada :)"
nil
"Clase cambiada :)"
"Instancia yeeei"
Les variables de classe quarden la mateixa referència tant en el pare com en el fill, on es modifiquen es van a reflectir en totes les classes.
3. Quan fer servir variables de classe?
Quan es volen magatzemar quan s’utilitzen variables que pertanyen a la classe i no a l’objecte.
Un exemple típic és utilitzar una classe amb figures.
Cal utilitzar variables d’instància quan no convé que aquestes variables se hereten a les classe filles.