【发布时间】:2011-03-21 11:10:08
【问题描述】:
作为一个红宝石新手,我想知道,宝石会不会相互冲突?例如,如果 2 个 gem 覆盖了数组上的
谢谢
【问题讨论】:
标签: ruby rubygems monkeypatching
作为一个红宝石新手,我想知道,宝石会不会相互冲突?例如,如果 2 个 gem 覆盖了数组上的
谢谢
【问题讨论】:
标签: ruby rubygems monkeypatching
我假设您在谈论重新定义方法,而不是覆盖它们,对吧?如果两个库在两个不同的子类中覆盖相同的方法,则不会有任何问题。
如果两个或多个库重新定义了相同的方法,那么最后加载的那个会胜出。实际上,这实际上与 one 库重新定义一个方法没有什么不同:Ruby 解释器为您提供了 Array#<< 的实现,如果您重新定义它,您的定义就会获胜,因为它来了稍后。
阻止这种情况的最佳方法很简单:不要到处乱用现有方法。并且不要使用这样做的库。启用警告的-w 命令行标志在那里非常有用,因为至少在 Ruby 1.9.2 中,如果方法被重新定义,它会打印一个警告。
在 Ruby 2.0 中,可能会有某种机制将方法(重新)定义隔离到某种命名空间中。不过,我不会屏住呼吸:这些所谓的selector namespaces 已经在 Ruby 社区中讨论了近 10 年,在 Smalltalk 社区中甚至比这更长,而且 AFAIK 没有人产生过有效的实现甚至是 Ruby 的工作设计。一个较新的想法是Classboxes 的想法。
【讨论】:
据我所知,您说的是猴子补丁(在 ruby 社区中也称为打鸭子)。
This article 有另一个猴子补丁(和其他做法)变坏的例子。
【讨论】:
实际上,不,但如果你真的尝试过,你可能会构建出这样的情况。这是一个interesting article(虽然很旧),它解释了这是如何发生的。
如果两个 gem “覆盖数组上的
【讨论】:
Symbol 类的相同方法(一个是 Sequel,另一个我现在不记得了)。不,您不必在 Ruby 中继承一个类来重新定义它的方法。