¿Hay alguna manera de tener variables de clase con setter / getter como variables virtuales?

StackOverflow https://stackoverflow.com/questions/128718

  •  02-07-2019
  •  | 
  •  

Pregunta

Estoy incrustando Ruby en mi proyecto C y quiero cargar varios archivos que definen una clase heredada de mi propia clase principal. Cada clase heredada necesita establecer algunas variables en la inicialización y no quiero tener dos variables diferentes para Ruby y C.

¿Hay alguna manera de definir una variable de clase que tenga un setter / getter personalizado propio o es una forma estúpida de manejarlo? ¿Quizás sería mejor con un tipo de datos personalizado?

¿Fue útil?

Solución

No estoy seguro exactamente de lo que estás preguntando. Por supuesto, las variables de clase pueden tener captadores y definidores (y detrás de escena puede almacenar el valor de la forma que desee). ¿Este fragmento ayuda a iluminar algo?

>> class TestClass
>>   def self.var
>>     @@var ||= nil
>>   end
>>   def self.var=(value)
>>     @@var = value
>>   end
>> end
=> nil
>> 
?> TestClass::var
=> nil
>> TestClass::var = 5
=> 5
>> TestClass::var
=> 5

Si le gusta la metaprogramación completa, puede implementar un método class_attr_accessor similar al attr_accessor . Lo siguiente es equivalente al código anterior.

class Module
  def class_attr_accessor(attribute_name)
    class_eval <<-CODE
      def self.#{attribute_name}
        @@#{attribute_name} ||= nil
      end
      def self.#{attribute_name}=(value)
        @@#{attribute_name} = value
      end
    CODE
  end
end

class TestClass
  class_attr_accessor :var
end
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top