From: rubikitch@... Date: 2008-05-07T18:07:34+09:00 Subject: [ruby-list:44896] Re: Method#arity From: "ARAI Shunichi" Subject: [ruby-list:44893] Re: Method#arity Date: Wed, 7 May 2008 17:28:47 +0900 るびきちです。 > メソッドの引数について詳細に調べるには、 > かなり複雑な手法を使う必要があるんですね。 そうなんです。 以下はrcovを使った別解です。 Rcov::CallSiteAnalyzer.new.run_hookedのブロックではcallsite, defsiteを得るための フックを設定しています。Rubyレベルだとset_trace_funcですが、 あれは遅すぎるので拡張ライブラリです。 defsiteでメソッドの定義位置(ファイル名と行番号)を得ることができます。 そこから行の内容を取り出し、それを解析していけば引数名や引数の数を得ることができるでしょう。 require 'rcov' class Rcov::CallSiteAnalyzer::DefSite def line_content @lines ||= File.readlines(file) @lines[line-1] end end def foo(a, b=nil, *c, &block) [a, b, c, block] end analyzer = Rcov::CallSiteAnalyzer.new # このブロック内で実行されたメソッドの定義位置を知ることができる。 analyzer.run_hooked do foo 1, 2, 3 end analyzer.analyzed_classes # => ["#", "Object", "Rcov::DifferentialAnalyzer"] analyzer.methods_for_class("Object") # => ["foo"] defsite = analyzer.defsite("Object#foo") # => # defsite.line_content # => "def foo(a, b=nil, *c, &block)\n" -- rubikitch Blog: http://d.hatena.ne.jp/rubikitch/ Site: http://www.rubyist.net/~rubikitch/