29

を持つクラスがある場合attr_accessor、デフォルトでは、対応するゲッターとセッターとともにインスタンス変数を作成します。しかし、インスタンス変数を作成する代わりに、代わりにクラス変数またはクラス インスタンス変数を作成する方法はありますか?

4

2 に答える 2

46

このような:

class TYourClass
  class << self
    attr_accessor :class_instance_variable
  end
end

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

attr_accessorは class のメソッドであり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

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

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
于 2009-05-21T23:18:29.227 に答える
20

Rails (またはどこでも)では、真のクラス変数アクセサーを取得するためにrequire 'active_support'使用できます。cattr_accessor :name

The class instance variables that others have pointed out are usually more useful. The APIdock cattr_accessor page has some helpful discussion clarifying when you would want one not the other, plus the source to the cattr_accessor, cattr_reader and cattr_writer functions.

于 2009-11-03T07:26:19.940 に答える