`respond_to?`与`respond_to_missing?`

时间:2012-12-09 23:37:53

标签: ruby metaprogramming

定义respond_to_missing?而不是定义respond_to?有什么意义?如果您为某个班级重新定义respond_to?会出现什么问题?

2 个答案:

答案 0 :(得分:41)

如果未定义respond_to_missing?,尝试通过method获取方法将失败:

class Foo
  def method_missing name, *args
    p args
  end

  def respond_to? name, include_private = false
    true
  end
end

f = Foo.new
f.bar  #=> []
f.respond_to? :bar  #=> true
f.method :bar  # NameError: undefined method `bar' for class `Foo'

class Foo
  def respond_to? *args; super; end  # “Reverting” previous redefinition

  def respond_to_missing? *args
    true
  end
end

f.method :bar  #=> #<Method: Foo#bar>

Marc-André(Ruby核心提交者)有一个很好的blog post on respond_to_missing?

答案 1 :(得分:0)

如果您要覆盖 method_missing ,那么创建 respond_to_missing?是个好习惯。这样,即使未明确声明该类,该类也会告诉您正在调用的方法存在。

回应?不应该被覆盖:)