私は自分のプログラムにトレースコードを設定していますが、どのメソッドがattr_accessor
で定義されているか知っています。 TracePoint
を使用すると、attr_accessor
が呼び出されたときを検出できますが、受け取った引数をどのように取得するのかわかりません。何か案は?`attr_accessor`によって定義されたすべての変数を` attr_accessor`をオーバーライドしないで取得します
8
A
答えて
0
obj.methods()
を使用すると、インスタンス上で利用可能なすべてのメソッド(スーパークラスからのメソッド)と、現在のシングルトンオブジェクトで定義されたメソッドのみを取得するobj.methods(false)
を取得できます。私は、これらのメソッドがどこで作成されたかを検出することができないのかどうかは確かではありません。
+0
これは本当に質問に答えるものではありませんか? :) –
6
質問のタイトルでは、変数のリストを尋ねましたが、これは定義されたメソッドのリスト。
このメソッドでは、インスタンス変数を手動で更新または作成するとノイズが発生することがあります。
module MethodTracer
TracePoint.trace(:c_call) do |t|
if (t.method_id == :attr_accessor)
t.self.extend(MethodTracer)
methods = t.self::Methods ||= []
MethodTracer.send(:define_method, :method_added) {|m| methods << m }
end
end
TracePoint.trace(:c_return) do |t|
if (t.method_id == :attr_accessor)
MethodTracer.send(:remove_method, :method_added)
end
end
end
class Foo
attr_accessor :a, :b
attr_accessor :c
def foo; end
end
Foo::Methods # => [:a, :a=, :b, :b=, :c, :c=]
私はMethods
定数のメソッド名を格納してきましたが、あなたのための最も便利な場所であればどこでも明らかにあなたがそれらを格納することができます。
method_added
をMethodTracer
に定義/削除すると、自分で定義したFoo.method_added
が壊れないようになります。しかし、この方法論では、attr_accessor
への呼び出しの前にFoo.method_added
を定義する場合は、super
を呼び出す必要があります。それ以外の場合はで定義された一時的なmethod_added
はスキップされます。
関連する問題
- 1. attr_accessorを使用してクラスにインスタンス変数が設定されていないのはなぜですか?
- 2. 未定義メソッドとattr_accessor
- 3. カスタムattr_accessorのために未定義のメソッド `validates_presence_of 'を取得する
- 4. ルビーのattr_accessor /インスタンス変数を取得する
- 5. attr_accessorを使用したキャッシュモデルアレイ?
- 6. インスタンスのすべてのattr_accessorフィールドのハッシュを取得する方法は?
- 7. クラスルビのすべてのインスタンス変数にattr_accessorを与える方法
- 8. Rubyクラスの変数設定のためにattr_accessorが機能しません
- 9. ActiveRecordはattr_accessorと比較してメソッドをどのように定義しますか?
- 10. attr_accessorとdef初期化に関して
- 11. searchlogic - attr_accessor
- 12. attr_accessor値
- 13. attr_accessorのキャスト値を入力してください
- 14. accept_nested_attributes_forでattr_accessorにアクセスできない
- 15. ノードクラスのAttr_accessor
- 16. attr_accessorの実装
- 17. NameErrorを取得中:変数が定義されていないときに定義されていません
- 18. deliver_laterを使用しているときにメーラーでattr_accessorにアクセスできない
- 19. URLが#で定義されていて、?ではない変数を取得していますか?
- 20. AutoMapper定義されたマッピングから、定義されたすべてのマッピングを取得します
- 21. ユーザによって定義されたC++定数変数
- 22. attr対attr_accessor
- 23. attr_accessor in method_missing
- 24. ページがリダイレクトされた後にattr_accessor = nilですか?
- 25. `attr_accessor`のないrailsモデルの非データベース属性を設定する
- 26. serializable_hash superは、オーバーライドされたメソッドで定義されたオプションをどのように取得しますか?
- 27. html.erbビューでattr_accessorを表示
- 28. 私はnormalizrスキーマで定義されたすべてのキーのリストを取得しようとしている
- 29. Rubyのattr_accessorが読み込まれていません
- 30. @instance_variableとattr_accessorの違い
インスタンス変数_all_を取得できます。これで十分でない場合は、attr_accessorをある意味で計測する必要があります。これを避ける方法はありません。 –
メソッドが 'attr_accessor'を使って定義されているか、あるいはインスタンス変数のアクセサメソッドであるメソッドを探しているかどうかは重要ですか? –
attr_accessorは私の後です。残りはTracePointで簡単に手に入ります。 –