为什么respond_to with initialize()返回false?

Bal*_*ala 3 ruby class

为什么我这样做会弄错 C.respond_to?(:initialize)

class C
  def initialize;end
  def meth;end
end

C.respond_to?(:initialize) #=> false
C.new.respond_to?(:meth) #=> true as expected
Run Code Online (Sandbox Code Playgroud)

另一种变化

class C
  def initialize;end

  def meth
    pmeth
  end

  private

  def pmeth
    respond_to?(:initialize)
  end
end
Run Code Online (Sandbox Code Playgroud)

Aru*_*hit 5

这是因为#initialize不是公共方法.如果要通过使用检查私有受保护方法#respond_to?,请将第二个参数设置为true.

文件明确说明

如果obj响应给定方法,则返回true.仅当可选的第二个参数的计算结果为true时,才会在搜索中包含专用和受保护的方法.

见下文:

class C
  def initialize;end
  def meth;end
end

C.respond_to?(:initialize,true)
# => true
C.new.respond_to?(:initialize)
# => false
C.new.respond_to?(:initialize,true)
# => true
C.private_methods(false).include?(:initialize) # => true
C.new.private_methods(false).include?(:initialize) # => true
Run Code Online (Sandbox Code Playgroud)