Gibt es eine Möglichkeit Klassenvariablen mit Setter / Getter wie virtuelle Variablen haben?

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

  •  02-07-2019
  •  | 
  •  

Frage

Ich bin Einbettung Rubin in mein C-Projekt und will mehrere Dateien laden, die eine Klasse definieren aus meiner eigenen übergeordneten Klasse geerbt. Jede vererbte Klasse braucht einige Variablen bei der Initialisierung gesetzt und ich will nicht zwei verschiedene Variablen für Ruby und C haben.

Gibt es eine Möglichkeit, eine Klassenvariable zu definieren, die einen eigenen benutzerdefinierten Setter / Getter hat oder ist dies eine dumme Art und Weise zu handhaben? Vielleicht wäre es mit einem benutzerdefinierten Datentyp besser sein?

War es hilfreich?

Lösung

Ich bin nicht sicher genau das, was Sie fragen. Natürlich können Klassenvariablen Getter und Setter (und hinter den Kulissen können Sie den Wert beliebig speichern Sie mögen). Enthält dieser Schnipsel hilft etwas beleuchten?

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

Wenn Sie in die ganze metaprogramming Sache sind, können Sie ein class_attr_accessor ähnliches Verfahren wie das attr_accessor Methode. Im Folgenden entspricht den obigen Code.

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top