Можно ли идентифицировать псевдонимы методов в Ruby? - PullRequest
12 голосов
/ 09 сентября 2010

Часто в консоли я буду опрашивать объект

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

В Ruby разработчик довольно часто предоставляет псевдонимы для методов. Мне интересно, есть ли рефлексивный способ определения псевдонимов, чтобы я мог отображать псевдонимы, например, ...

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

Это было бы полезно для возможности точно определить, сколько вещей может сделать объект.

Ответы [ 2 ]

14 голосов
/ 09 сентября 2010

В 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]. Это связано с ошибкой , которая теперь исправлена ​​ и будет в следующей версии (2.0.0). Если это важно для вас, вы можете бросить свой собственный group_by без использования хешей или eql? и только с использованием ==.

0 голосов
/ 09 сентября 2010

Не совсем. Псевдоним - это не просто указатель или что-то в этом роде, после псевдонима вы можете отменить определение первого метода, и метод с псевдонимами не изменится (представьте, что жесткая ссылка против ссылки sym). Как правило, псевдонимы отражаются в RDOC, поэтому я бы пошел туда для окончательного списка.

...