3

为什么我做错了 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
4

1 回答 1

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
于 2013-08-28T13:49:51.427 回答