2010-09-09 70 views
12

通常在控制台中,我将询问的对象是否有可能在Ruby中识别别名方法?

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

在Ruby中这是很常见的一个开发者的方法提供别名。我想知道是否有确定的别名,这样我也许能显示别名的方法,类似的反射方式...

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

这将是能够识别到底有多少东西的对象有帮助可以做。

+0

ri_for宝石可能会帮助http://github.com/rdp/ri_for – rogerdpack 2010-09-09 16:02:50

回答

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?和只使用==

+0

不错。还有一个原因,我不能等到每个人都将他们的rubylib升级到最新的Ruby。 – Mario 2010-09-09 22:54:19

0

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