从方法调用获取方法名称? (红宝石)

时间:2014-03-01 01:50:42

标签: ruby-on-rails ruby

给出一个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"

我知道可以使用方法方法做类似的事情,但这需要输入一个符号作为参数。我实际上想避免这样做,因为重点是启用代码完成,因此您不必担心重新输入方法名称。

1 个答案:

答案 0 :(得分:0)

在您编写它的方式中,这是不可能的,因为您的method_name方法必须在层次结构中非常高,可能Object以便在所有可能的结果的方法。您method_name方法的问题在于,它无法在您调用的方法中 您调用的方法的em>,通常没有关于它来自的方法的名称的信息(除非这些方法明确写入以返回此信息)。

方法中,您可以访问__callee__方法或__method__方法,该方法返回调用它们的方法名称。这只会与如果方法已被别名化,则在def …中调用该方法。

方法中,您还可以通过caller方法(生成数组)访问您的调用堆栈。但是,这仍然不能完全允许您执行您喜欢的操作,因为当您调用bar时,您将无法在 {/ 1}}和baz方法中操作在这些方法的结果上(在撰写本文时都是零)。结果在调用堆栈上没有任何信息。