重载method_missing和method_added的危险

时间:2012-06-27 05:43:04

标签: ruby

每当我与Rubyists交谈时,我都能听到关于method_addedmethod_missing的精彩内容。但是,我最近被指责在一个项目中使用它们。参数是另一个库(例如rspec)也可能重载方法,并将程序置于一个奇怪的状态,具体取决于首先调用的method_missing版本。

我很想知道这种情况经常发生的频率。超载method_missing是否真的那么危险?有没有人有method_missing冲突导致的现实世界的祸患?

1 个答案:

答案 0 :(得分:4)

要注意的一件事是,如果您(重新)在类上定义method_missing,则替换此方法的任何先前实现(例如,来自Gem)。 您可以通过创建一个继承自您要使用method_missing扩展的类的新类来避免这种情况。

然而,这通常不是问题,因为大多数宝石都有自己的类。

要记住的另一件事是始终super的末尾调用method_missing,以免破坏方法调用链。

def method_missing(m, *args, &block)
  # your code...

  super
end

也许这张Ruby Method Lookup Flow的图片也很有帮助。