Ruby访问符号“由......调用”

我想(高效地)获取符号,在运行时调用别名方法。 直接高效地访问某种堆栈框架对象以获得它将是幻想。

即:

Foo级
def generic_call(* args)
puts(“generic_call()通过使用#{???}”调用))
结束

别名:specific_call1:generic_call
别名:specific_call2:generic_call

结束

Foo.new.specific_call1
Foo.new.specific_call2

我想要的结果


generic_call()是通过使用specific_call1()调用的
generic_call()是通过使用specific_call2()调用的


class Foo
  def generic_call()
    puts "generic call was called by #{caller[0][/in `([^']+)'/, 1]}"
  end

  def specific_call1() generic_call end
  def specific_call2() generic_call end
end

Foo.new.specific_call2 # Prints: generic call was called by specific_call2

如果您使用的别名创建然而,这将无法正常工作specific_callNgeneric_call因为别名创建的方法实际上是原方法的一个副本-他们不实际调用原来的方法(这就是为什么你可以自由地重新定义了原不影响别名)。


获取当前方法名称的代码片段:

module Kernel
    private
    # Defined in ruby 1.9
    unless defined?(__method__)
      def __method__
        caller[0] =~ /`([^']*)'/ and $1
      end
    end
  end

没有内置的方法来做到这一点。 你可以这样破解它:

def current_method_name
  caller[0].split('`').last.split(''')[0]
end
链接地址: http://www.djcxy.com/p/95425.html

上一篇: Ruby access to symbol "invoked by"

下一篇: What exactly is the singleton class in ruby?