Есть ли способ использовать переменные класса с сеттером/геттером, например виртуальные переменные?

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

  •  02-07-2019
  •  | 
  •  

Вопрос

Я встраиваю 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top