Есть ли способ получить все псевдонимы метода в Ruby? - PullRequest
4 голосов
/ 03 июля 2011

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

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

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

Ответы [ 3 ]

2 голосов
/ 04 июля 2011

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

 def is_alias obj, meth
   obj.method(meth).inspect =~ /#<Method:\s+(\w+)#(.+)>/
   $2 != meth.to_s
 end
2 голосов
/ 03 июля 2011

Я не уверен, как это сделать без использования сравнений. Однако, если вы удалите 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 
0 голосов
/ 03 июля 2011

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

...