29

attr_accessorのクラスがある場合、デフォルトでは対応するゲッターとセッターとともにインスタンス変数が作成されます。しかし、インスタンス変数を作成する代わりに、代わりにクラス変数またはクラスインスタンス変数を作成する方法がありますか?このようRubyのattr_accessorは、インスタンス変数の代わりにクラス変数またはクラスインスタンス変数を生成する方法を教えてください。

+0

「[見ているメタクラスをはっきりと見る](http://viewsourcecode.org/why/hacking/seeingMetaclassesClearly.html)」で作業してください。 Rubyのクラスとオブジェクトの仕組みを理解しようとすると非常に役に立ちます。 –

答えて

46

class TYourClass 
    class << self 
    attr_accessor :class_instance_variable 
    end 
end 

あなたは(クラス自体がインスタンスである)クラスのメタクラスを開いて、それに属性を追加すると、この時に見ることができます。

attr_accessorは、クラスClassのメソッドです。クラスには、インスタンス変数を読み取るメソッドとそれを設定するメソッドの2つが追加されます。

class Class 
    def my_attr_accessor(name) 
    define_method name do 
     instance_variable_get "@#{name}" 
    end 
    define_method "#{name}=" do |new_val| 
     instance_variable_set "@#{name}", new_val 
    end 
    end 
end 

完全にテストされていないクラス属性アクセサ:Railsでは

class Class 
    def class_attr_accessor(name) 
    define_method name do 
     class_variable_get "@@#{name}" 
    end 
    define_method "#{name}=" do |new_val| 
     class_variable_set "@@#{name}", new_val 
    end 
    end 
end 
+0

ありがとうございます。私はクラスのメタクラスを開いて、補題を追加するというあなたのやり方が好きです。しかし、なぜそれがクラス変数の代わりにクラスインスタンス変数を生成するのですか?また、クラス変数を生成することも可能ですか、この構文はクラスインスタンス変数に対してのみ機能しますか? –

+0

I'ts different、再度回答を参照 –

+0

これはクラスインスタンス変数に対してのみ有効です.b/c attr_ *は、(あるオブジェクトの)インスタンス変数のメソッドを定義します。 – rampion

20

、(またはどこでもあなたがrequire 'active_support'を行う)あなたは真のクラス変数アクセサを取得するためにcattr_accessor :nameを使用することができますここで可能な実装です。

他の人が指摘しているクラスインスタンス変数は、通常より便利です。 APIdock cattr_accessor pageには、どちらが他のものでもないときに、cattr_accessorcattr_reader、およびcattr_writerファンクションへの送信元を指定するときに役立つ説明があります。

+0

もっと簡単に - レールがこれを提供しているかどうかはわかりませんでした。ありがとう! –

関連する問題