2010-09-09 59 views
12

通常在控制檯中,我將詢問的對象是否有可能在Ruby中識別別名方法?

pp obj.methods.sort #or... 
pp (obj.methods - Object.methods).sort 

在Ruby中這是很常見的一個開發者的方法提供別名。我想知道是否有確定的別名,這樣我也許能顯示別名的方法,類似的反射方式...

array.aliased_methods #=> {:collect => :map, ...} 

這將是能夠識別到底有多少東西的對象有幫助可以做。

+0

ri_for寶石可能會幫助http://github.com/rdp/ri_for – rogerdpack 2010-09-09 16:02:50

回答

14

在Ruby 1.9,別名實例方法將是eql?,這樣你就可以定義:

class Module 
    def aliased_methods 
    instance_methods.group_by{|m| instance_method(m)}. 
     map(&:last).keep_if{|symbols| symbols.length > 1} 
    end 
end 

現在,如果你嘗試,你會得到:

class Foo 
    def bar; 42 end 
    alias baz bar 
    def hello; 42 end 
end 

Foo.aliased_methods # => [[:bar, :baz]] 

Array.aliased_methods # => [[:inspect, :to_s], [:length, :size]] 

注意一些對失蹤,例如[:map, :collect]。這是由於bug that is now fixed並將在下一個版本(2.0.0)如果它對你很重要,你可以推出自己的group_by而不使用散列或eql?和只使用==

+0

不錯。還有一個原因,我不能等到每個人都將他們的rubylib升級到最新的Ruby。 – Mario 2010-09-09 22:54:19

0

不是。別名不僅僅是一個指針或類似的東西,在一個別名之後,你可以解開第一個方法,並且別名方法不會改變(認爲硬鏈接vs sym鏈接)。通常,別名會反映在rdoc中,所以我會去那裏尋找一個明確的列表。