为什么在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
答案 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