每当我与 Rubyists 交谈时,我都会听到关于method_added
和method_missing
. 然而,我最近因为在一个项目中同时使用这两种方法而受到指责。争论是另一个库(例如 rspec,例如)也可以重载方法,并使程序处于奇怪的状态,具体取决于method_missing
首先调用哪个版本。
我很想知道这种情况发生的频率。超载真的有那么危险method_missing
吗?method_missing
有没有人有现实世界的冲突引起的灾难的例子?
每当我与 Rubyists 交谈时,我都会听到关于method_added
和method_missing
. 然而,我最近因为在一个项目中同时使用这两种方法而受到指责。争论是另一个库(例如 rspec,例如)也可以重载方法,并使程序处于奇怪的状态,具体取决于method_missing
首先调用哪个版本。
我很想知道这种情况发生的频率。超载真的有那么危险method_missing
吗?method_missing
有没有人有现实世界的冲突引起的灾难的例子?
要记住的一件事是,如果您(重新)定义method_missing
一个类,您将替换此方法的任何先前实现(例如来自 Gem)。您可以通过创建一个继承自您要使用 method_missing 扩展的类的新类来避免这种情况。
但是,这通常不是问题,因为大多数宝石都有自己的类。
要记住的另一件事是始终super
在末尾 调用method_missing
以不破坏方法调用链。
def method_missing(m, *args, &block)
# your code...
super
end
也许这个Ruby Method Lookup Flow的图形也很有帮助。