【问题标题】:How does Object#respond_to? work?Object#respond_to 如何?工作?
【发布时间】:2013-04-18 23:45:37
【问题描述】:

查看此类定义:

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。

【问题讨论】:

  • super 在当前对象的上下文中运行,而不是在超类中。所以它只是调用了respond_to的默认实现?

标签: ruby


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 是的 Object#respond_to?仍然检查 T 的实例是否响应该方法,而不是 Object 本身的实例。一开始我并没有想清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    • 2020-07-08
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多