代码之家  ›  专栏  ›  技术社区  ›  salt.racer

获取当前执行方法的名称

  •  180
  • salt.racer  · 技术社区  · 16 年前

    $0 是顶级Ruby程序的变量,但是否有当前方法的变量?

    5 回复  |  直到 6 年前
        1
  •  291
  •   mplewis    8 年前

    比我的第一个答案更好的是,你可以使用“方法”。

    class Foo
      def test_method
        __method__
      end
    end
    

    例如,它返回一个符号_“_, :test_method . 要以字符串形式返回方法名,请调用 __method__.to_s 相反。

    注: 这需要Ruby 1.8.7。

        2
  •  22
  •   Mark A. Nicolosi    16 年前

    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
  •  13
  •   Kelvin    6 年前

    根据您的实际需要,您可以使用 __method__ __callee__ ,返回当前执行方法的名称作为符号。

    在Ruby1.9中,它们的行为相同(只要 docs 还有我的测试)。

    在Ruby 2.1和2.2上 阿尔卡莱耶斯 如果调用已定义方法的别名,则行为会有所不同。这个 docs 因为这两者是不同的:

    • α方法 :“当前方法定义的名称”(即定义的名称)
    • 阿尔卡莱耶斯 :“当前方法的被调用名称”(即被调用(调用)的名称)

    测试脚本:

    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.93.产量:

    1.9.3
    {:call_orig=>{:callee=>:orig, :method=>:orig},
     :call_alias=>{:callee=>:orig, :method=>:orig}}
    

    2.1.2输出( 阿尔卡莱耶斯 返回别名,但 α方法 返回方法定义点的名称):

    2.1.2
    {:call_orig=>{:callee=>:orig, :method=>:orig},
     :call_alias=>{:callee=>:myalias, :method=>:orig}}
    
        4
  •  10
  •   l3x    11 年前

    对于Ruby1.9+我建议使用 __callee__

        5
  •  -2
  •   Hetal Khunti    10 年前

    我在视图文件中检索方法名时遇到了同样的问题。我的解决方案是

    params[:action] # it will return method's name
    

    如果你想得到控制器的名字,那么

    params[:controller] # it will return you controller's name