1

请参阅此类定义:

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#respond_to?,但仍在 C 的上下文/范围内,因此它返回 true。

4

2 回答 2

2

super并不意味着检查它是否响应'T的超类,而只是意味着使用respond_to从 ' 的超类扩展的方法T

因为T有实例方法t2,所以会返回true

于 2013-04-25T07:25:12.003 回答
1

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

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

于 2013-04-25T12:08:08.340 回答