nodewrap
rubikitchさんの「[ruby]Procの中身を文字列で得る、それが可能なんだな」(http://d.hatena.ne.jp/rubikitch/20080704/1215165794)を読んでいてnodewrap(http://rubystuff.org/nodewrap/)というライブラリを思い出したのでメモ
rubygemsを使ってインストールできます
$ gem install nodewrap Bulk updating Gem source index for: http://gems.rubyforge.org Building native extensions. This could take a while... Successfully installed nodewrap-0.5.0
これを使うと、ソースが無くてもprocの中身を得ることが出来ます。
$ irb -rrubygems irb(main):001:0> require 'as_code' => true irb(main):002:0> def fact(x) (x == 0) ? 1 : x * fact(x -1) end => nil irb(main):003:0> p method(:fact).as_code "def fact(x)\n (x == 0) ? 1 : (x * fact(x - 1))\nend" => nil irb(main):004:0>
他にも面白い機能が満載です。ほとんど使っていないけど・・・。
追記
前の例ではprocの中身を見たことにならないですね。改めて、procの中身を見ようと試したところ・・・エラーになりました(涙。
irb(main):014:0> code = proc { puts "Hello"} => #<Proc:0x7fe37c5c@(irb):14> irb(main):015:0> code.as_code NoMethodError: undefined method `local_table' for #<Node::NEWLINE:0x7fe36014> from /usr/lib/ruby/gems/1.8/gems/nodewrap-0.5.0/lib/procsig.rb:91:in `ar guments' from /usr/lib/ruby/gems/1.8/gems/nodewrap-0.5.0/lib/procsig.rb:178:in `s ignature' from /usr/lib/ruby/gems/1.8/gems/nodewrap-0.5.0/lib/as_code.rb:284:in `a s_code' from (irb):15 irb(main):016:0>