方法缺失

始終在此功能的底部呼叫 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