atributo Heredable se llevó a cabo principalmente para tratar el problema donde variable de clase rubí se comparte a través la herencia de clase. Considere este ejemplo
class Counter
@@count = 0
def self.count
@@count
end
def self.increment
puts "==> #{self} increment"
@@count += 1
end
end
class DogCounter < Counter
end
puts "Counter.count: #{Counter.count}"
puts "DogCounter.count: #{DogCounter.count} -> nice, DogCounter inherits @@count from Counter"
DogCounter.increment
puts "DogCounter.count: #{DogCounter.count} -> as expected"
puts "Counter.count: #{Counter.count} -> but Counter.count is also changed!"
Counter.increment
puts "Counter.count: #{Counter.count}"
puts "DogCounter.count: #{DogCounter.count} -> @@count is shared with all the descendants of Counter"
Esto producirá esta salida
Counter.count: 0
DogCounter.count: 0 -> nice, DogCounter inherits @@count from Counter
==> DogCounter increment
DogCounter.count: 1 -> as expected
Counter.count: 1 -> but Counter.count is also changed!
==> Counter increment
Counter.count: 2
DogCounter.count: 2 -> @@count is shared with all the descendants of Counter
Tenga en cuenta que desde los carriles de 3,2 write_inheritable_attribute se ha eliminado. Ver http://dev.mensfeld.pl/2012/01/upgrading-to-rails-3-2-0-from-rails-3-1-3/
Con atributo de clase (lo que solía ser atributo heredable) podemos implementar algo como esto:
class Counter
class_attribute :count
self.count = 0
def self.increment
puts "==> #{self} increment"
self.count += 1
end
end
class DogCounter < Counter
end
puts "Counter.count: #{Counter.count}"
puts "DogCounter.count: #{DogCounter.count} -> nice, DogCounter inherits count from Counter"
DogCounter.increment
puts "DogCounter.count: #{DogCounter.count} -> as expected"
puts "Counter.count: #{Counter.count} -> nice, it doesn't change count for Counter"
Counter.increment
puts "Counter.count: #{Counter.count}"
puts "DogCounter.count: #{DogCounter.count} -> now each subclass can have their own class attribute that inherits default value from the superclass"
Esto producirá esta salida
Counter.count: 0
DogCounter.count: 0 -> nice, DogCounter inherits count from Counter
==> DogCounter increment
DogCounter.count: 1 -> as expected
Counter.count: 0 -> nice, it doesn't change count for Counter
==> Counter increment
Counter.count: 1
DogCounter.count: 1 -> now each subclass can have their own class attribute that inherits default value from the superclass
Gracias. Todavía no estoy seguro de entenderlo completamente, pero aprecio la respuesta. –
Es difícil explicar algunas de las características avanzadas de Ruby a menos que tenga mucho contexto. Recomiendo encarecidamente el libro "Metaprogramación Ruby" para una explicación amplia y accesible de este tipo de características: http://pragprog.com/titles/ppmetr/metaprogramming-ruby – bowsersenior
Gracias. Está en mi estantería esperando mis ojos. Probablemente lo rompa este fin de semana. –