请参阅此课程定义:
class T
def respond_to?(name)
name.to_s == 't' || super
end
def t; p 't'; end
def t2; p 't2'; end
end
当我打电话
T.new.respond_to? :t2
它似乎会返回false,因为它要么等于't',要么也不响应T的超类,即Object。但是,它返回true。那么任何人都可以解释这是如何工作的吗?
更新: 我意识到我之前的想法是错误的。
class P
def t; self.class; end
end
class C < P
def t
p self.class
p super
end
end
我打电话的时候 C.new.t
我希望结果是:
C
P
然而,我得到了:
C
C
那么回到respond_to?问题,当我调用super时,它运行Object #response_to ?,但仍然在C的上下文/范围内,所以它返回true。
答案 0 :(得分:2)
super
并不意味着检查它是否会回复T
的超类,而只是意味着使用respond_to
&T
& #39;超级班。
由于T
具有实例方法t2
,因此它将返回true
。
答案 1 :(得分:1)
super并不意味着“忘记你是T的一个实例”,这意味着要调用你的超类'respond_to?
的实现
该实现不是硬编码来检查Object的方法,它是一个通用的实现,它遍历对象的祖先,检查方法的存在。