Есть ли способ получить все псевдонимы метода в Ruby?

Предположим, у меня есть класс:

class MyClass
  def my_method
    # cool stuff
  end
  alias :my_method2 :method
end

А теперь я хочу получить все псевдонимы для метода my_method без сравнения со всеми методами объекта.


person icanhazbroccoli    schedule 03.07.2011    source источник
comment
Показать весь соответствующий код. И как псевдоним method относится к вопросу?   -  person sawa    schedule 03.07.2011
comment
Почему вы не хотите сравнить с другими методами?   -  person Mark Thomas    schedule 03.07.2011
comment
Соответствующий код — метод ActiveSupport:: Memoizable.memoize. Это не работает для методов с псевдонимами (на самом деле не знаю, должно ли это быть, но я хочу, чтобы это было так в моем проекте). Я думаю, что сравнение здесь не универсальный способ.   -  person icanhazbroccoli    schedule 03.07.2011


Ответы (3)


Я не уверен, как это сделать без использования сравнений. Однако, если вы удалите Object.methods, вы можете ограничить количество сделанных сравнений:

def aliased?(x)
  (methods - Object.methods).each do |m|
    next if m.to_s == x.to_s
    return true if method(m.to_sym) == method(x.to_sym)
  end
  false
end 
person Mark Thomas    schedule 03.07.2011

Немного хака, но вроде работает в 1.9.2 (но не в 1.8 и т.д.):

 def is_alias obj, meth
   obj.method(meth).inspect =~ /#<Method:\s+(\w+)#(.+)>/
   $2 != meth.to_s
 end
person Vasfed    schedule 04.07.2011

MyClass.instance_methods(false) предоставит вам только методы экземпляра, определенные для вашего класса. Это хороший способ избавиться от любых методов-предков. В вашем случае должны отображаться только методы my_method и my_method2.

person bheeshmar    schedule 03.07.2011