方法缺失

始终在此功能的底部调用 super。这可以在调用某些内容时保存静默失败,并且你不会收到错误。

例如,此 method_missing 将导致问题:

class Animal
  def method_missing(method, *args, &block)
    say, speak = method.to_s.split("_")
    if say == "say"
      speak
    end
  end
end

=> Animal.new.foobar
=> nil # This should really be raising an error

method_missing 是一个很好的工具,适当时使用,但你应该考虑两个成本。首先,method_missing 效率较低 - 红宝石必须先搜索类及其所有祖先,然后才能回归这种方法; 在一个简单的情况下,这种性能损失可能微不足道,但可以加起来。其次,更广泛地说,这是一种具有强大功能的元编程形式,它负责确保实施是安全的,正确处理恶意输入,意外输入等等。

你也应该像这样覆盖 respond_to_missing?

class Animal
  def respond_to_missing?(method, include_private = false)
    method.to_s.start_with?("say_") || super
  end
end

=> Animal.new.respond_to?(:say_moo) # => true