を持つクラスがある場合attr_accessor
、デフォルトでは、対応するゲッターとセッターとともにインスタンス変数を作成します。しかし、インスタンス変数を作成する代わりに、代わりにクラス変数またはクラス インスタンス変数を作成する方法はありますか?
質問する
34652 次
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 に答える