Ruby 如何确定类是否具有“initialize”?

Ruby 如何确定类是否具有“initialize”?,ruby,Ruby,我有以下课程 class Logger def initialize(message) @message = message end def log puts @message end end 当我访问在类本身而不是继承链中定义的实例方法时,我只返回[:log]: Logger.instance_methods(false) # => [:log] 当类中未定义initialize方法时,结果相同。我还检查了它是否在继承链中定义;它不是: Logger.

我有以下课程

class Logger
  def initialize(message)
    @message = message
  end
  def log
    puts @message
  end
end
当我访问在类本身而不是继承链中定义的实例方法时,我只返回
[:log]

Logger.instance_methods(false) # => [:log]
当类中未定义initialize方法时,结果相同。我还检查了它是否在继承链中定义;它不是:

Logger.instance_methods.include?(:initialize) # => false
它可以单独访问:

Logger.instance_method(:initialize) # => #<UnboundMethod: Logger#initialize>

如何获取所有已定义的方法,包括
初始化

实际上
初始化
方法是
私有
。所以

Logger.private_instance_methods(false)
#=> [:initialize]

Logger.private_instance_methods(false) | Logger.instance_methods(false)
#=> [:initialize, :log]

默认情况下,Ruby类中的所有方法都是任何人都可以公开访问的。尽管如此,此规则只有两个例外:对象类下定义的全局方法和任何类的initialize方法。它们都是隐式私有的

你可以向你的班级提出同样的问题,你们的班级会告诉你,是否有这个方法。看这个


instance\u methods
method为您提供了公共和受保护的实例方法,initialize是一个私有方法
Logger.private\u instance\u methods(false)
他可以通过Logger.private\u methods(false)请求布尔答案。include?(:initialize)谢谢,这正好返回了我想要的结果。我没有意识到它是私有的,因为
Logger。instance\u method(:initialize)
返回了消息对象,我认为私有实例方法将被排除在外。感谢您提供initialize methods可见性的解释!
Logger.private_instance_methods(false)
#=> [:initialize]

Logger.private_instance_methods(false) | Logger.instance_methods(false)
#=> [:initialize, :log]
#!/usr/bin/env ruby

class Foo
  def initialize
  end
end

Foo.private_method_defined?(:initialize) # => true