Object#public_methods无法按预期工作

时间:2015-10-21 06:42:36

标签: ruby

我创建了一个新模块:

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方法?

1 个答案:

答案 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]