ChatGPT解决这个技术问题 Extra ChatGPT

获取当前执行方法的名称

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

一种用途是检查是否可以在 SimpleDelegator 对象中调用 superdef description; __getobj__.respond_to?(__method__) ? super : 'No description'; end

m
mplewis

甚至比我的第一个答案更好,您可以使用__method__:

class Foo
  def test_method
    __method__
  end
end

这将返回一个符号 – 例如,:test_method。要将方法名称作为字符串返回,请改为调用 __method__.to_s

注意:这需要 Ruby 1.8.7。


':' 只是符号符号。 :) 只需执行 __method__.to_s ,它将是方法名称,仅此而已
如果我在 rake 任务中怎么办?
K
Kelvin

根据您的实际需要,您可以使用 __method____callee__,它们将当前正在执行的方法的名称作为符号返回。

在 ruby 1.9 上,它们的行为相同(就 docs 和我的测试而言)。

在红宝石 2.1 和2.2 如果您调用已定义方法的别名,__callee__ 的行为会有所不同。两者的 docs 不同:

__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}}

M
Mark A. Nicolosi

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__ 不这样做吗?
很好的解决方案 Mark 目前最好的解决方案。很好
l
l3x

对于 Ruby 1.9+,我建议使用 __callee__


__callee__ 在 1.9 之前的行为有所不同,因此最好坚持使用 __method__,因为它具有一致的行为。在 1.9 之后,__callee__ 的行为与 __method__ 相同。
@LeighMcCulloch 你能用一个例子解释一下区别吗(可能在一个新的答案中)?
@CiroSantilli六四事件法轮功纳米比亚威视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你没看到什么奇怪的吗?
@LeighMcCulloch 实际上现在 __callee____method__ 有不同的行为。请参阅 pastie.org/10380985(红宝石 2.1.5)
paste.org 已关闭。永远还是现在?
H
Hetal Khunti

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

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

如果你想得到控制器的名字然后

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

我认为您将问题误解为有关 rails 控制器操作和 http 方法的问题……这个答案可能应该被删除。
对于从视图中获取当前正在执行的(控制器)方法的名称很有用。