试图在ruby

时间:2018-01-03 13:46:41

标签: ruby methods built-in

我有一个我想调用的函数,并让它返回调用它的函数的名称。这是功能:

def get_pos
  func = __method__.to_s
  puts "You are in #{func}"
end

我知道__method__会返回当前正在执行的方法的名称。

我想从get_pos()拨打test,这是我想要的输出:

def test
  get_pos
end

You are in test

相反,我得到以下

You are in get_pos

我明白为什么会这样。由于__method__位于getpos函数内,因此它返回该函数的名称。

我知道如果我做了以下更改并将__method__作为参数传递给函数,我将得到预期的结果。这是:

def get_pos(method)
  puts "You are in #{method}"
end

def test
  get_pos(__method__.to_s)
end

You are in test

代码已经简化,但是它是记录器中功能的一部分,我希望能够将有关代码中当前位置的数据转储到日志中,并确切地知道我所在的模块,类和功能。

除了每次将__method__作为参数传递给函数之外,还有更好/更清晰的方法吗?

2 个答案:

答案 0 :(得分:3)

为什么不从内核对象中使用@

我重构了你的代码:

__callee__

在这种情况下,哪个输出def current puts __callee__ end def test_caller current end test_caller

current中有各种有趣的方法。我建议您查看API here

答案 1 :(得分:3)

您可以使用caller_locations返回Thread::Backtrace::Location个实例的数组:(默认情况下从索引1开始,不包括当前方法)

def foo
  caller_locations.map(&:base_label)
end

def bar
  foo
end

def baz
  bar
end

baz
#=> ["bar", "baz", "<main>"]

foo来自bar的{​​{1}}来自baz,该<main>是在moddir_policy.中调用的。