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

时间:2010-09-09 13:13:24

标签: ruby alias

通常在控制台中,我会询问一个对象

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

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

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

这有助于确定对象可以做多少事情。

2 个答案:

答案 0 :(得分:14)

在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]。这是由于bug that is now fixed并且将在下一个版本(2.0.0)中。如果它对您很重要,您可以不使用哈希或group_by滚动自己的eql?使用==

答案 1 :(得分:0)

不是真的。别名不只是一个指针或类似的东西,在别名之后你可以取消第一个方法并且别名方法不会改变(想想硬链接vs sym链接)。通常,别名会反映在rdoc中,所以我会去那里找一个明确的列表。