$0 is the variable for the top level Ruby program, but is there one for the current method?
5 Answers
Even better than my first answer you can use __method__:
class Foo def test_method __method__ end end This returns a symbol – for example, :test_method. To return the method name as a string, call __method__.to_s instead.
Note: This requires Ruby 1.8.7.
2 Comments
__method__.to_s and it'll be the method name, nothing elseDepending on what you actually want, you can use either __method__ or __callee__, which return the currently executing method's name as a symbol.
On ruby 1.9, both of them behave identically (as far as the docs and my testing are concerned).
On ruby 2.1 & 2.2 __callee__ behaves differently if you call an alias of the defined method. The docs for the two are different:
__method__: "the name at the definition of the current method" (i.e. the name as it was defined)__callee__: "the called name of the current method" (i.e. the name as it was called (invoked))
Test script:
require 'pp' puts RUBY_VERSION class Foo def orig {callee: __callee__, method: __method__} end alias_method :myalias, :orig end pp( {call_orig: Foo.new.orig, call_alias: Foo.new.myalias} ) 1.9.3 Output:
1.9.3 {:call_orig=>{:callee=>:orig, :method=>:orig}, :call_alias=>{:callee=>:orig, :method=>:orig}} 2.1.2 Output (__callee__ returns the aliased name, but __method__ returns the name at the point the method was defined):
2.1.2 {:call_orig=>{:callee=>:orig, :method=>:orig}, :call_alias=>{:callee=>:myalias, :method=>:orig}} Comments
From http://snippets.dzone.com/posts/show/2785:
module Kernel private def this_method_name caller[0] =~ /`([^']*)'/ and $1 end end class Foo def test_method this_method_name end end puts Foo.new.test_method # => test_method 3 Comments
__callee__ not do this?For Ruby 1.9+ I'd recommend using __callee__
6 Comments
__callee__ behaves differently prior to 1.9, so it's best to stick with __method__ since it has consistent behavior. __callee__ behaves the same as __method__ after 1.9.def m1() puts("here is #{__method__} method. My caller is #{__callee__}.") end; def m2() puts("here is #{__method__} method. Let's call m1"); m1 end; m2 Don't you see anything strange ?__callee__ and __method__ has different behaviour. See pastie.org/10380985 (ruby 2.1.5)I got the same issue to retrieve method name in view file. I got the solution by
params[:action] # it will return method's name if you want to get controller's name then
params[:controller] # it will return you controller's name
supercan be called within a SimpleDelegator object:def description; __getobj__.respond_to?(__method__) ? super : 'No description'; end