通常在控制台中,我会询问一个对象
pp obj.methods.sort #or...
pp (obj.methods - Object.methods).sort
在Ruby中,开发人员为方法提供别名是很常见的。我想知道是否有一种识别别名的反射方式,以便我可以显示别名方法,比如......
array.aliased_methods #=> {:collect => :map, ...}
这有助于确定对象可以做多少事情。
答案 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中,所以我会去那里找一个明确的列表。