方法缺失
始终在此功能的底部调用 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