Есть ли способ иметь переменные класса с сеттерами / геттерами, как виртуальные переменные? - PullRequest
2 голосов
/ 24 сентября 2008

Я встраиваю Ruby в свой проект C и хочу загрузить несколько файлов, которые определяют класс, унаследованный от моего собственного родительского класса. Каждый унаследованный класс должен устанавливать некоторые переменные при инициализации, и я не хочу иметь две разные переменные для Ruby и C.

Есть ли способ определить переменную класса, которая имеет собственный пользовательский установщик / получатель, или это глупый способ справиться с этим? Может быть, было бы лучше с пользовательским типом данных?

1 Ответ

5 голосов
/ 27 сентября 2008

Я не совсем уверен, что вы спрашиваете. Конечно, переменные класса могут иметь геттеры и сеттеры (и за кулисами вы можете хранить значение любым удобным вам способом). Этот фрагмент помогает что-то осветить?

>> 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...