Подтвердить что ты не робот

Можно ли идентифицировать методы псевдонимов в Ruby?

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

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

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

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

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

4b9b3361

Ответ 1

В Ruby 1.9 методы aliased экземпляров будут 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? и используйте только ==.

Ответ 2

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