我有一个我想调用的函数,并让它返回调用它的函数的名称。这是功能:
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__
作为参数传递给函数之外,还有更好/更清晰的方法吗?
答案 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.
中调用的。