`respond_to?`与`respond_to_missing?`

saw*_*awa 40 ruby metaprogramming

定义respond_to_missing?与定义相反的重点是什么respond_to??如果重新定义respond_to?某些课程会出现什么问题?

And*_*all 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>
Run Code Online (Sandbox Code Playgroud)

Marc-André(Ruby核心提交者)有一篇很好的博客文章respond_to_missing?.

  • 出于兴趣,“respond_to”有什么用呢?它有合法的用例吗? (3认同)
  • @BrendonMuir 重新定义它?从来没有,真的。但是 `respond_to?` 应该总是被调用的方法。您不应该直接调用“respond_to_missing?”。 (2认同)

ces*_*ves 5

创建respond_to_missing 是一个很好的做法吗?如果您要覆盖method_missing。这样,类就会告诉您正在调用的方法存在,即使它没有显式声明。

回应?可能不应该被覆盖:)