我创建了一个新模块:
module M
def self.g
end
end
我想列出M
中定义的所有(类)方法。当然,M.public_methods
也会列出Object
的方法,所以我尝试了:
M.public_methods(false)
但是当我在irb中尝试这个时,它仍然列出了许多其他方法:
M.public_methods(false)
# => [:g, :freeze, :===, :==, :<=>, :<, :<=, :>, :>=, :to_s, :inspect, :included_modules, …]
我可以使用
获得我想要的结果M.public_methods(false) - Object.public_methods
令我感到惊讶。 false
参数是否已经摆脱了所有Object
方法?
答案 0 :(得分:3)
false
参数是否已经摆脱了所有Object
方法?
Object#public_methods
文件的措词当然可以改进。什么是意味着是当all
参数是false
时,它只返回单例类和接收者类的实例方法,但不返回任何超类。因此,在您的情况下,返回的方法是M
的单例类(g
)加上Module
的所有公共实例方法。
您可以通过比较M.public_methods(false)
和Module.public_instance_methods(false)
的输出来验证这一点:
M.public_methods(false) - Module.public_instance_methods(false)
# => [:g]
M.public_methods(false) & Module.public_instance_methods(false) ==
Module.public_instance_methods(false)
# => true
Object#singleton_methods
会给你你想要的答案:
M.singleton_methods(false)
# => [:g]