Answers:
比我的第一个答案更好的是,您可以使用__method__:
class Foo
  def test_method
    __method__
  end
end
这将返回一个符号-例如,:test_method。要以字符串形式返回方法名称,请调用__method__.to_s。
注意:这需要Ruby 1.8.7。
__method__.to_s,它将成为方法名称,别无其他
                    从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
              __callee__这样做吗?
                    根据实际需要,可以使用__method__或__callee__,这将返回当前正在执行的方法的名称作为符号。
在ruby 1.9上,它们的行为相同(就文档和我的测试而言)。
在ruby 2.1和2.2上,__callee__如果调用已定义方法的别名,则行为会有所不同。两者的文档不同:
__method__:“当前方法定义时的名称”(即定义的名称)__callee__:“当前方法的被调用名称”(即被调用(调用)的名称)测试脚本:
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输出:
1.9.3
{:call_orig=>{:callee=>:orig, :method=>:orig},
 :call_alias=>{:callee=>:orig, :method=>:orig}}
2.1.2输出(__callee__返回别名,但__method__在定义方法时返回名称):
2.1.2
{:call_orig=>{:callee=>:orig, :method=>:orig},
 :call_alias=>{:callee=>:myalias, :method=>:orig}}
              对于Ruby 1.9+,我建议使用 __callee__
__callee__在1.9之前的行为有所不同,因此最好坚持使用,__method__因为它具有一致的行为。__callee__行为与__method__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你看不到什么奇怪的东西吗?
                    我在检索视图文件中的方法名称时遇到了同样的问题。我得到了解决方案
params[:action] # it will return method's name
如果要获取控制器名称,则
params[:controller] # it will return you controller's name
              
super可以在SimpleDelegator对象中调用检查:def description; __getobj__.respond_to?(__method__) ? super : 'No description'; end