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

时间:2013-08-28 13:48:47

标签: 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

另一种变化

class C
  def initialize;end

  def meth
    pmeth
  end

  private

  def pmeth
    respond_to?(:initialize)
  end
end

1 个答案:

答案 0 :(得分: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