仮想変数のようなセッター/ゲッターを備えたクラス変数を使用する方法はありますか?

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

  •  02-07-2019
  •  | 
  •  

質問

Ruby を C プロジェクトに埋め込んでおり、自分の親クラスから継承したクラスを定義するいくつかのファイルをロードしたいと考えています。継承された各クラスは初期化時にいくつかの変数を設定する必要がありますが、Ruby と C に 2 つの異なる変数を設定したくありません。

独自のカスタムセッター/ゲッターを持つクラス変数を定義する方法はありますか、それともこれを処理する愚かな方法ですか?おそらくカスタムデータ型を使用した方が良いでしょうか?

役に立ちましたか?

解決

あなたが何を尋ねているのか正確にはわかりません。もちろん、クラス変数にはゲッターとセッターを含めることができます (また、バックグラウンドで好きな方法で値を格納できます)。この断片は何かを解明するのに役立ちますか?

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