假設我有一個類:有沒有辦法在Ruby中獲取所有方法的別名?
class MyClass
def my_method
# cool stuff
end
alias :my_method2 :method
end
現在我想要得到的方法my_method所有別名沒有與所有對象的方法比較。
假設我有一個類:有沒有辦法在Ruby中獲取所有方法的別名?
class MyClass
def my_method
# cool stuff
end
alias :my_method2 :method
end
現在我想要得到的方法my_method所有別名沒有與所有對象的方法比較。
我不知道如何做到這一點,而不使用比較。但是,如果您刪除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
MyClass.instance_methods(false)
會給你只爲你的類定義的實例方法。這是擺脫任何祖先方法的好方法。在你的情況下,唯一應該顯示的方法是my_method
和my_method2
。
一個黑客一點,但似乎在1.9.2工作(而不是確實在1.8等):
def is_alias obj, meth
obj.method(meth).inspect =~ /#<Method:\s+(\w+)#(.+)>/
$2 != meth.to_s
end
謝謝,這對我來說是個竅門,不管你是不是破解。 – Swim
顯示所有相關的代碼。 「方法」的別名與這個問題有什麼關係? – sawa
爲什麼你不想與其他方法比較? –
相關的代碼是ActiveSupport :: Memoizable.memoize方法。它不適用於別名方法(實際上並不知道它是否應該,但我希望它在我的項目中)。我認爲比較不是一種普遍的方式。 – icanhazbroccoli