如何获取调用方法的名称?

jri*_*lai 152 ruby

Ruby中有没有办法在方法中找到调用方法名?

例如:

class Test
  def self.foo
    Fooz.bar
  end
end

class Fooz
  def self.bar
    # get Test.foo or foo
  end
end
Run Code Online (Sandbox Code Playgroud)

Dig*_*oss 197

puts caller[0]
Run Code Online (Sandbox Code Playgroud)

也许...

puts caller[0][/`.*'/][1..-2]
Run Code Online (Sandbox Code Playgroud)

  • 它给出了调用方法的名称,但它没有给出该方法属于哪个模块或类的任何指示.那可能吗? (10认同)
  • 是的,请参阅Kernel#caller,又名http://www.ruby-doc.org/core-1.8.7/classes/Kernel.html#M001073 (5认同)
  • 这是Wanderfull! (2认同)
  • 这在 Rails 5.2.1 中似乎不起作用。在 Rails 控制器中,这会返回““make_lambda 中的块””。我想这仅适用于 Ruby。 (2认同)

Mar*_*une 158

在Ruby 2.0.0中,您可以使用:

caller_locations(1,1)[0].label
Run Code Online (Sandbox Code Playgroud)

它比Ruby 1.8+解决方案快得多:

caller[0][/`([^']*)'/, 1]
Run Code Online (Sandbox Code Playgroud)

backports当我得到时间(或拉动请求!)时会包括在内.

  • 现在它似乎是Ruby 2.2.0上的`caller_locations [0] .label`,否则你总是有`send_action`结果 (6认同)
  • 我们如何才能只调用应用程序方法并忽略框架调用? (2认同)

Dor*_*ian 30

使用caller_locations(1,1)[0].label(对于ruby> = 2.0)

编辑:我的回答是说要使用,__method__但我错了,它返回当前的方法名称,请参阅此要点.

  • 这是不正确的,它返回当前方法,而不是调用当前方法的方法... (4认同)

Héc*_*cía 20

我用

caller[0][/`([^']*)'/, 1]
Run Code Online (Sandbox Code Playgroud)

  • @collimarco只要字符串不包含超出你正在寻找的那个(并且我认为它不能),结果将是相同的,当然.但是,`[^']*`会表现得更好,因为正则表达式引擎会在表达式达到''时停止尝试匹配表达式(你的版本将结束,然后回溯,因为它没有找到最后一个``` 当然,在这种情况下,这种差异可以忽略不计,但在可能的情况下,避免使用正则表达式中的`.`这是一个好习惯. (7认同)
  • 这比DigitalRoss的方法有什么优势? (4认同)
  • 更清洁,更精确.而不是进行搜索,然后使用数组方法根据位置(可能不正确)拆分不需要的字符. (2认同)
  • 为什么不简单地使用调用者[0] [/`(.*)'/,1]?我不是关于正则表达式的大师,但似乎有效. (2认同)