2009-09-20 83 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,然後調整一下代碼。