Est-il possible d'avoir des variables de classe avec setter / getter comme des variables virtuelles?

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

  •  02-07-2019
  •  | 
  •  

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é?

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top