¿Hay alguna manera de tener variables de clase con setter / getter como variables virtuales?
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?
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