attr_accessor
のクラスがある場合、デフォルトでは対応するゲッターとセッターとともにインスタンス変数が作成されます。しかし、インスタンス変数を作成する代わりに、代わりにクラス変数またはクラスインスタンス変数を作成する方法がありますか?このようRubyのattr_accessorは、インスタンス変数の代わりにクラス変数またはクラスインスタンス変数を生成する方法を教えてください。
答えて
:
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
ありがとうございます。私はクラスのメタクラスを開いて、補題を追加するというあなたのやり方が好きです。しかし、なぜそれがクラス変数の代わりにクラスインスタンス変数を生成するのですか?また、クラス変数を生成することも可能ですか、この構文はクラスインスタンス変数に対してのみ機能しますか? –
I'ts different、再度回答を参照 –
これはクラスインスタンス変数に対してのみ有効です.b/c attr_ *は、(あるオブジェクトの)インスタンス変数のメソッドを定義します。 – rampion
、(またはどこでもあなたがrequire 'active_support'
を行う)あなたは真のクラス変数アクセサを取得するためにcattr_accessor :name
を使用することができますここで可能な実装です。
他の人が指摘しているクラスインスタンス変数は、通常より便利です。 APIdock cattr_accessor
pageには、どちらが他のものでもないときに、cattr_accessor
、cattr_reader
、およびcattr_writer
ファンクションへの送信元を指定するときに役立つ説明があります。
もっと簡単に - レールがこれを提供しているかどうかはわかりませんでした。ありがとう! –
- 1. 関数レベル変数の代わりに定数またはパッケージレベルの変数を参照してください
- 2. 変数を別の変数に代入する方法を教えてください
- 3. 共有インスタンス内で変数が変更されたときを知る方法を教えてください
- 4. Rubyのクラス変数インスタンス変数
- 5. 別のクラスのインスタンス変数でユーザー入力を受け入れる方法を教えてください。
- 6. クラスルビのすべてのインスタンス変数にattr_accessorを与える方法
- 7. Ruby ActiveSupport :: Concernでクラス変数を使用する代わりに
- 8. 変数のLLVMオプティマイザの内容を教えてください
- 9. decltype式で変数を指定する方法を教えてください。
- 10. サーバー生成変数を追加して登録する方法を教えてください。
- 11. PHP:exif_imagetype()関数は、JPEGの代わりにJPGファイルを受け入れる方法を教えてください。
- 12. Rubyのattr_accessorは自動的に属性のインスタンス変数を作成しますか?例えば
- 13. システム変数(linux)の代わりにhome変数を使う方法は?
- 14. Javaの変数の代わりに変数のconentsを参照する方法
- 15. 静的クラス変数の値をSpringに保持する方法を教えてください。
- 16. PHP/MySQLで列変数を1回だけ変更する方法を教えてください。
- 17. ファイルの代わりに変数にmofcomp.exeを使用してください。
- 18. インスタンス変数をローカル変数に代入
- 19. Java - 匿名の内部クラスから非最終変数にアクセスする方法を教えてください。
- 20. クラスのインスタンスを作成して変数に割り当てる方法は?
- 21. Arduinoで実際の文字列をchar変数の文字列(角カッコで囲まれた変数)に変換する方法を教えてください。
- 22. クラス変数を使ったメソッド呼び出しの取得方法を教えてください。
- 23. SPARQLクエリで特定の変数の結果の数を制限する方法を教えてください。
- 24. グローバル変数の代わりにクラス属性を使用する方法は?
- 25. Javaデコンパイラが変数またはオブジェクト名を知る方法を教えてください。
- 26. サブクラス間の変数を比較して作成する方法を教えてください。 Java
- 27. 関数変数をjqueryプラグインのように呼び出す方法を教えてください。
- 28. エンティティ変数教えてくださいどこ
- 29. テキストボックスの値を変数に割り当てる方法を教えてください。
- 30. このジオコード要求を変数に割り当てる方法を教えてください。
「[見ているメタクラスをはっきりと見る](http://viewsourcecode.org/why/hacking/seeingMetaclassesClearly.html)」で作業してください。 Rubyのクラスとオブジェクトの仕組みを理解しようとすると非常に役に立ちます。 –