C'è un modo per avere variabili di classe con setter / getter come variabili virtuali?

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

  •  02-07-2019
  •  | 
  •  

Domanda

Sto incorporando Ruby nel mio progetto C e voglio caricare diversi file che definiscono una classe ereditata dalla mia classe genitore. Ogni classe ereditata deve impostare alcune variabili sull'inizializzazione e non voglio avere due variabili diverse per Ruby e C.

C'è un modo per definire una variabile di classe che ha un proprio setter / getter personalizzato o è un modo stupido di gestirlo? Forse sarebbe meglio con un tipo di dati personalizzato?

È stato utile?

Soluzione

Non sono sicuro esattamente cosa stai chiedendo. Naturalmente le variabili di classe possono avere getter e setter (e dietro le quinte è possibile memorizzare il valore nel modo desiderato). Questo frammento aiuta a illuminare qualcosa?

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

Se ti piacciono le metaprogrammazioni, puoi implementare un metodo class_attr_accessor simile al attr_accessor metodo. Quanto segue equivale al codice precedente.

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top