2011-07-03 49 views
4

假設我有一個類:有沒有辦法在Ruby中獲取所有方法的別名?

class MyClass 
    def my_method 
    # cool stuff 
    end 
    alias :my_method2 :method 
end 

現在我想要得到的方法my_method所有別名沒有與所有對象的方法比較。

+1

顯示所有相關的代碼。 「方法」的別名與這個問題有什麼關係? – sawa

+0

爲什麼你不想與其他方法比較? –

+0

相關的代碼是ActiveSupport :: Memoizable.memoize方法。它不適用於別名方法(實際上並不知道它是否應該,但我希望它在我的項目中)。我認爲比較不是一種普遍的方式。 – icanhazbroccoli

回答

2

我不知道如何做到這一點,而不使用比較。但是,如果您刪除Object.methods可以限制所做的比較:

def aliased?(x) 
    (methods - Object.methods).each do |m| 
    next if m.to_s == x.to_s 
    return true if method(m.to_sym) == method(x.to_sym) 
    end 
    false 
end 
0

MyClass.instance_methods(false)會給你只爲你的類定義的實例方法。這是擺脫任何祖先方法的好方法。在你的情況下,唯一應該顯示的方法是my_methodmy_method2

2

一個黑客一點,但似乎在1.9.2工作(而不是確實在1.8等):

def is_alias obj, meth 
    obj.method(meth).inspect =~ /#<Method:\s+(\w+)#(.+)>/ 
    $2 != meth.to_s 
end 
+0

謝謝,這對我來說是個竅門,不管你是不是破解。 – Swim

相關問題