[#44909] VRDdeClientについて — Toshiyasu Soejima <clev@...2.so-net.ne.jp>

17 messages 2008/05/11

[#44936] yamlとencoding — "Yutaka Kanemoto" <kinpoco@...>

金本と申します。

16 messages 2008/05/14

[ruby-list:44896] Re: Method#arity

From: rubikitch@...
Date: 2008-05-07 09:07:34 UTC
List: ruby-list #44896
From: "ARAI Shunichi" <arai@mellowtone.org>
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                # => ["#<Class:Rcov::CallSiteAnalyzer>", "Object", "Rcov::DifferentialAnalyzer"]
analyzer.methods_for_class("Object")     # => ["foo"]
defsite = analyzer.defsite("Object#foo") # => #<struct Rcov::CallSiteAnalyzer::DefSite file="/m/home/rubikitch/xmpfilter.tmpfile_11874-1.rb", line=10>
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/

In This Thread