Есть ли способ использовать переменные класса с сеттером/геттером, например виртуальные переменные?
Вопрос
Я встраиваю Ruby в свой проект C и хочу загрузить несколько файлов, определяющих класс, унаследованный от моего родительского класса.Каждому унаследованному классу при инициализации необходимо установить некоторые переменные, а я не хочу иметь две разные переменные для Ruby и C.
Есть ли способ определить переменную класса, которая имеет собственный установщик/получатель, или это глупый способ справиться с этим?Может быть, было бы лучше использовать собственный тип данных?
Решение
Я не уверен, что именно вы спрашиваете.Конечно, переменные класса могут иметь геттеры и сеттеры (и за кулисами вы можете сохранить значение любым удобным для вас способом).Этот фрагмент помогает что-нибудь прояснить?
>> 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
Если вы увлекаетесь метапрограммированием, вы можете реализовать метод class_attr_accessor, аналогичный методу attr_accessor метод.Следующий код эквивалентен приведенному выше коду.
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