2010-09-09 2 views
12

Oft innerhalb der Konsole, werde ich ein ObjektIst es möglich, Alias-Methoden in Ruby zu identifizieren?

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

In Ruby verhören es ist ziemlich üblich, dass ein Entwickler Aliase für Methoden zur Verfügung zu stellen. Ich frage mich, ob es eine reflektierende Art und Weise zu identifizieren Aliase ist so, dass ich in der Lage sein könnte aliased Methoden angezeigt werden, so etwas wie ...

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

Dies wäre hilfreich für genau identifizieren zu können, wie viele Dinge, um ein Objekt tun können.

+0

die ri_for Juwel könnte helfen http://github.com/rdp/ri_for – rogerdpack

Antwort

14

In Ruby 1.9 aliased Instanzmethoden eql? sein, so können Sie festlegen:

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

Nun, wenn Sie es versuchen, werden Sie erhalten:

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]] 

Beachten Sie, dass einige Paare fehlen , z.B [:map, :collect]. Dies ist auf eine bug that is now fixed zurückzuführen und wird in der nächsten Version (2.0.0) sein. Wenn es Ihnen wichtig ist, können Sie Ihre eigenen group_by ohne Verwendung von Hashes oder eql? und nur unter Verwendung == rollen.

+0

Nizza. Nur noch ein Grund, warum ich nicht warten kann, bis alle ihre Rubylibs auf den neuesten Ruby aktualisiert haben. – Mario

0

Nicht wirklich. Alias ​​ist nicht nur ein Zeiger oder ähnliches, nach einem Alias ​​können Sie die erste Methode deaktivieren und die Alias-Methode wird sich nicht ändern (denken Sie hart Link vs Symlink). Normalerweise werden Aliase im Rdoc angezeigt, also würde ich dort für eine definitive Liste gehen.