1

作为一个红宝石新手,我想知道,宝石会不会相互冲突?例如,如果 2 个 gem 覆盖了数组上的 << 方法,哪个会赢,或者有什么可以阻止这种情况?

谢谢

4

3 回答 3

4

我假设您正在谈论重新定义方法,而不是覆盖它们,对吗?如果两个库在两个不同的子类中覆盖相同的方法,就不会有任何问题。

如果两个或多个库重新定义了相同的方法,那么最后加载的那个获胜。事实上,这实际上与一个库重新定义一个方法没有什么不同:Ruby 解释器Array#<<为您提供了一个实现,如果您重新定义它,您的定义就会胜出,因为它出现得较晚。

阻止这种情况的最好方法很简单:不要到处乱用现有方法。并且不要使用这样做的库。启用警告的-w命令行标志在那里非常有用,因为至少在 Ruby 1.9.2 中,如果方法被重新定义,它会打印一个警告。

在 Ruby 2.0 中,可能会有某种机制将方法(重新)定义隔离到某种名称空间中。不过,我不会屏住呼吸:这些所谓的选择器命名空间已经在 Ruby 社区中讨论了近 10 年,在 Smalltalk 社区中甚至比这更久,而且 AFAIK 没有人产生过有效的实现或甚至是 Ruby 的工作设计。一个较新的想法是Classboxes的想法。

于 2010-07-27T07:35:45.143 回答
1

据我所知,您说的是猴子补丁(在 ruby​​ 社区中也称为打鸭子)。

这篇文章有另一个猴子补丁(和其他做法)变坏的例子。

于 2010-07-28T00:25:04.327 回答
0

实际上,不,尽管如果您真的尝试过,您可能会构建出这样的情况。这是一篇有趣的文章(虽然很旧),它解释了这是如何发生的。

如果两个 gem “覆盖数组上的 << 方法”,它们将需要继承 Array,并且这些类将具有不同的名称或位于不同的模块中。

于 2010-07-27T07:34:36.003 回答