privados - ¿Heredar variables de instancia de nivel de clase en Ruby?
variables de clase rails (3)
Lo que hice en mi proyecto para usar resque es definir una base
class ResqueBase
def self.inherited base
base.instance_variable_set(:@queue, :queuename)
end
end
En los otros trabajos secundarios, la instancia de cola se establecerá de forma predeterminada. Espero que pueda ayudar.
Quiero que una clase secundaria herede una variable de instancia de nivel de clase de su padre, pero parece que no puedo entenderlo. Básicamente estoy buscando una funcionalidad como esta:
class Alpha
class_instance_inheritable_accessor :foo #
@foo = [1, 2, 3]
end
class Beta < Alpha
@foo << 4
def self.bar
@foo
end
end
class Delta < Alpha
@foo << 5
def self.bar
@foo
end
end
class Gamma < Beta
@foo << ''a''
def self.bar
@foo
end
end
Y luego quiero que esto salga así:
> Alpha.bar
# [1, 2, 3]
> Beta.bar
# [1, 2, 3, 4]
> Delta.bar
# [1, 2, 3, 5]
> Gamma.bar
# [1, 2, 3, 4, ''a'']
Obviamente, este código no funciona. Básicamente, quiero definir un valor predeterminado para las variables de instancia de nivel de clase en la clase principal, que heredan sus subclases. Un cambio en una subclase será el valor predeterminado para una subclase. Quiero que todo esto suceda sin un cambio en el valor de una clase que afecta a sus padres o hermanos. Class_inheritable_accessor da exactamente el comportamiento que quiero ... pero para una variable de clase.
Siento que podría estar pidiendo demasiado. ¿Algunas ideas?
Rails tiene esto incorporado en el marco como un método llamado class_attribute . Siempre puede consultar la fuente de ese método y crear su propia versión o copiarla literalmente. Lo único que hay que tener en cuenta es que no cambia los elementos mutables en su lugar .
Use una mezcla:
module ClassLevelInheritableAttributes
def self.included(base)
base.extend(ClassMethods)
end
module ClassMethods
def inheritable_attributes(*args)
@inheritable_attributes ||= [:inheritable_attributes]
@inheritable_attributes += args
args.each do |arg|
class_eval %(
class << self; attr_accessor :#{arg} end
)
end
@inheritable_attributes
end
def inherited(subclass)
@inheritable_attributes.each do |inheritable_attribute|
instance_var = "@#{inheritable_attribute}"
subclass.instance_variable_set(instance_var, instance_variable_get(instance_var))
end
end
end
end
Al incluir este módulo en una clase, le da dos métodos de clase: inheritable_attributes y heredado.
El método de clase heredado funciona de la misma manera que el método autoincluido en el módulo que se muestra. Cada vez que una clase que incluye este módulo recibe una subclase, establece una variable de instancia de nivel de clase para cada una de las variables de instancia heredables declaradas de nivel de clase (@inheritable_attributes).