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

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

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

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

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

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

在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] 。 这是因为现在修复了一个错误,并且将在下一个版本(2.0.0)中。如果它对您很重要,您可以在不使用散列或eql?情况下滚动自己的group_by eql? 并且只使用==

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