ruby2.2.2で現在実行中の関数名を取得する

前提

ganmacs@ganmacs~% ruby -v
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-darwin14]

内容

現在実行中の関数名を取得したいとき、ruby 1.8までは以下のようにしてとれた。   しかし1.9からto_s(Array)の挙動が変わったらしく2.2.2では動かなった。

class Object
  def current_method
    caller.first.scan(/`(.*)'/).to_s
  end
end

# when ruby version is 1.8 or earlier
puts current_method #=> "<main>"

# when ruby verison is 1.9 or later
puts current_method #=> [["<main>"]]

なので今は以下のように書くと実行中の関数名を取得できる

class Object
  def current_method_name
    caller.first.match(/`(?<method_name>.*)'/)[:method_name]
  end
end

puts current_method_name #=> "<main>"

参考

to_s (Array) - Rubyリファレンス

Rubyで今実行中のメソッド名を知る - 2nd life

正規表現