Gibt es eine Möglichkeit Klassenvariablen mit Setter / Getter wie virtuelle Variablen haben?
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?
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