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>