2009-09-20 94 views
0

我想(有效)获得符号的别名方法被调用在运行时。直接高效地访问某种堆栈框架对象以获得它将是幻想。红宝石访问符号“由援引”

即:

类Foo
    DEF generic_call(*参数)
       看跌期权( “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()

回答

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 

如果使用别名来generic_call创建specific_callN因为别名创建的方法实际上是原始方法的副本然而,这将不工作 - 他们不实际调用原来的方法(这就是为什么你可以自由重新定义原始文件而不影响别名)。

+0

是的别名“函数指针”,即分配:lambda来在对象的哈希留下游离的被操纵原始符号另一个符号。现在可以分配给符号实际的“代码”块anoymous和“名字来源于它被赋予的象征,但:) – 2009-09-22 23:55:21

0

有没有内置的方式做到这一点。你可以种本事喜欢:

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

是“知道这:) 效率不高:) – 2009-09-22 23:51:43

1

代码片断,以获得当前的方法名称:

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

负其目的是有一个方法,可以做一些符号,而不必复制和实例化每个新的代码块:) – 2009-09-22 23:56:46

+0

赦免我想删除之前的评论 - 这是错误的:) – 2009-09-22 23:59:22

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 

免责声明:我不知道红宝石,我只是谷歌搜索how one performs currying there,然后调整一下代码。