Object#respond_to如何?工作?

时间:2013-04-25 07:21:43

标签: ruby

请参阅此课程定义:

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。

2 个答案:

答案 0 :(得分:2)

super并不意味着检查它是否会回复T的超类,而只是意味着使用respond_toT& #39;超级班。

由于T具有实例方法t2,因此它将返回true

答案 1 :(得分:1)

super并不意味着“忘记你是T的一个实例”,这意味着要调用你的超类'respond_to?的实现

该实现不是硬编码来检查Object的方法,它是一个通用的实现,它遍历对象的祖先,检查方法的存在。