给出一个Foo类:
class Foo
def self.bar
end
def baz
end
end
可以创建一个名为“method_name”的对象方法,该方法返回被调用方法的名称吗?
>>Foo.bar.method_name
"Foo.bar"
或者如果在实例上调用?
>>f=Foo.new
#<Foo:0x3bdc138>
>>f.baz.method_name
"Foo.baz"
我知道可以使用方法方法做类似的事情,但这需要输入一个符号作为参数。我实际上想避免这样做,因为重点是启用代码完成,因此您不必担心重新输入方法名称。
答案 0 :(得分:0)
在您编写它的方式中,这是不可能的,因为您的method_name
方法必须在层次结构中非常高,可能Object
以便在所有可能的结果的方法。您method_name
方法的问题在于,它无法在您调用的方法中 您调用的方法的em>,通常没有关于它来自的方法的名称的信息(除非这些方法明确写入以返回此信息)。
在方法中,您可以访问__callee__
方法或__method__
方法,该方法返回调用它们的方法名称。这只会与如果方法已被别名化,则在def …
中调用该方法。
在方法中,您还可以通过caller
方法(生成数组)访问您的调用堆栈。但是,这仍然不能完全允许您执行您喜欢的操作,因为当您调用bar
时,您将无法在 {/ 1}}和baz
方法中操作在这些方法的结果上(在撰写本文时都是零)。结果在调用堆栈上没有任何信息。