Est-il possible d'avoir des variables de classe avec setter / getter comme des variables virtuelles?
Question
J'intègre Ruby dans mon projet C et souhaite charger plusieurs fichiers définissant une classe héritée de ma propre classe parent. Chaque classe héritée doit définir des variables à l’initialisation et je ne souhaite pas avoir deux variables différentes pour Ruby et C.
Existe-t-il un moyen de définir une variable de classe qui possède son propre programme de définition / d'acquisition, ou s'agit-il d'un moyen stupide de le gérer? Ce serait peut-être mieux avec un type de données personnalisé?
La solution
Je ne sais pas exactement ce que vous demandez. Bien sûr, les variables de classe peuvent avoir des accesseurs et des ajusteurs (et en coulisse, vous pouvez stocker la valeur comme vous le souhaitez). Cet extrait aide-t-il à éclairer quoi que ce soit?
>> 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 vous êtes intéressé par la métaprogrammation, vous pouvez implémenter une méthode class_attr_accessor similaire à la attr_accessor . Ce qui suit est équivalent au code ci-dessus.
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