2010-09-09 10 views
12

Spesso all'interno della console, mi interrogo un oggettoÈ possibile identificare i metodi con alias in Ruby?

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

In Ruby è abbastanza comune per uno sviluppatore di fornire gli alias per i metodi. Mi chiedo se c'è un modo riflettente di identificare gli alias in modo che io possa essere in grado di visualizzare i metodi alias, qualcosa di simile ...

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

Questo sarebbe utile per essere in grado di identificare esattamente quante cose un oggetto può fare.

+0

la gemma ri_for potrebbe aiutare http://github.com/rdp/ri_for – rogerdpack

risposta

14

In Ruby 1.9, metodi di istanza aliasing sarà eql?, in modo da poter definire:

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

Ora se lo provate, si otterrà:

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

Si noti che alcune coppie mancano , per esempio [:map, :collect]. Ciò è dovuto a un bug that is now fixed e sarà nella prossima versione (2.0.0) Se è importante per voi, è possibile eseguire il rollover del proprio group_by senza utilizzare hash o eql? e utilizzando solo ==.

+0

Nice. Ancora una ragione per cui non vedo l'ora che tutti aggiornino i loro rubylibs all'ultimo Ruby. – Mario

0

Non proprio. L'alias non è solo un puntatore o qualcosa del genere, dopo un alias è possibile annullare la definizione del primo metodo e il metodo alias non cambierà (si pensi a link hard vs sym link). Tipicamente, gli alias si riflettono nel rdoc, quindi andrei lì per un elenco definitivo.

Problemi correlati