rails privados poo objetos manejo herencia ejemplos clases clase atributos ruby oop inheritance scope instance-variables

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).