2010-09-09 14 views
12

A menudo dentro de la consola, voy a interrogar un objeto¿Es posible identificar métodos alias en Ruby?

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

en Ruby es bastante común para un desarrollador para proporcionar alias de métodos. Me pregunto si hay una manera reflexiva de la identificación de alias para que pudiera ser capaz de mostrar métodos alias, algo así como ...

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

Esto sería útil para poder identificar con exactitud cuántas cosas un objeto puede hacer.

+0

la gema ri_for podría ayudar http://github.com/rdp/ri_for – rogerdpack

Respuesta

14

En Ruby 1.9, los métodos de instancia alias serán eql?, por lo que puede definir:

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

Ahora bien, si lo pruebas, se obtiene:

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

Tenga en cuenta que algunos pares faltan , p.ej [:map, :collect]. Esto se debe a un bug that is now fixed y estará en la próxima versión (2.0.0) Si es importante para usted, puede rodar su propio group_by sin usar valores hash o eql? y solo usando ==.

+0

Agradable. Solo una razón más por la que no puedo esperar hasta que todos actualicen sus rubylibs al último Ruby. – Mario

0

No realmente. Alias ​​no es solo un puntero o algo así, después de un alias puedes descifrar el primer método y el método de alias no cambiará (piensa en el enlace duro vs enlace sym). Normalmente, los alias se reflejan en el rdoc, así que iría allí para obtener una lista definitiva.

Cuestiones relacionadas