Ruby访问符号“调用”

时间:2009-09-20 18:39:15

标签: 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()

调用的

4 个答案:

答案 0 :(得分:1)

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_callN创建generic_call,这将无效。因为别名创建的方法实际上是原始方法的副本 - 它们实际上并不调用原始方法(这就是为什么你可以在不影响别名的情况下自由地重新定义原文。)

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

def current_method_name
  caller[0].split('`').last.split('\'')[0]
end

答案 3 :(得分:0)

也许,你想要这样的东西吗?

class Object
  def named_alias(name, generic_name)
    ([Class, Module].include?(self.class) ? self : self.class).class_eval do
      define_method(name) { |*args| send(generic_name, name, *args) }
    end
  end
end

class Foo
  def generic_call(f, *args)
    puts("generic_call() was called by using #{f} with #{args}")
  end

  # def specific_call1(*args)
  #     generic_call(:specific_call1, *args)
  # end
  named_alias(:specific_call1, :generic_call)
  named_alias(:specific_call2, :generic_call)
end

Foo.new.specific_call1
Foo.new.specific_call2

免责声明:我不知道Ruby,我刚刚用Google搜索how one performs currying there,然后对代码进行了一些调整。