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