是否有可能在Ruby中识别别名方法?

Mar*_*rio 12 ruby alias

通常在控制台内,我会查询一个对象

pp obj.methods.sort #or...
pp (obj.methods - Object.methods).sort
Run Code Online (Sandbox Code Playgroud)

在Ruby中,开发人员为方法提供别名是很常见的.我想知道是否有一种识别别名的反射方式,以便我可以显示别名方法,如...

array.aliased_methods #=> {:collect => :map, ...}
Run Code Online (Sandbox Code Playgroud)

这有助于能够准确识别对象可以做多少事情.

Mar*_*une 15

在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
Run Code Online (Sandbox Code Playgroud)

现在,如果你尝试它,你会得到:

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]]
Run Code Online (Sandbox Code Playgroud)

请注意,缺少一些对,例如[:map, :collect].这是因为现在修复了一个错误,并且将在下一个版本(2.0.0)中.如果它对您很重要,您可以自行滚动group_by而不使用哈希或eql?仅使用==.