我想(有效地)获取符号,在运行时调用别名方法。直接有效地访问某种堆栈框架对象以获得它将是幻想。
即:
等级Foo
generic_call()通过使用specific_call1()来调用
generic_call()是使用specific_call2()
答案 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,然后对代码进行了一些调整。