2010-07-27 182 views
1

作为一个红宝石新手,我想知道,宝石会不会与彼此冲突?例如,如果2个宝石覆盖了阵列上的方法,哪个会胜出,或者有什么可以阻止这个?红宝石有没有冲突?

谢谢

回答

4

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

如果两个或多个库重新定义了相同的方法,那么无论哪一个碰巧加载最后的胜者​​。实际上,这实际上与一个库重新定义方法没有什么不同:Ruby解释器为您提供了一个Array#<<的实现,如果您重新定义了它,那么您的定义会获胜,这仅仅是因为它稍后出现。

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

在Ruby 2.0中,可能会有某种机制将方法(重新)定义分离成某种类型的命名空间。但我不会屏住呼吸:这些所谓的selector namespaces已经在Ruby社区中讨论了近10年了,在Smalltalk社区中甚至比这个时间还要长,AFAIK从来没有人提供过工作实现,甚至没有人Ruby的工作设计。一个更新的想法是Classboxes的想法。

0

在实践中,不,如果你真的尝试过,你可能会构建这样的情况。这是一个interesting article(虽然很古老),解释了这可能会发生。

如果两个gem“覆盖了array上的方法<”,则它们需要对Array进行子类化,而这些类将具有不同的名称或位于不同的模块中。

+1

实际上,它也发生在实践中。我们曾经有过两种宝石的经验,重新定义了“符号”类的相同方法(其中一个是Sequel,另一个我现在不记得)。不,你不需要在Ruby中继承一个类来重新定义它的方法。 – 2010-07-27 11:51:47

+0

您不必为子类重新定义方法,但是您可以重写它们,这就是问题所在。但你是对的,我误解了这个问题。 – 2010-07-27 13:58:41

+0

我认为在Ruby中重写和重新定义方法并没有什么区别,只是一个命名约定 - 如果您在继承的类中执行该操作,则会“重写”,如果您在已定义的类中执行此操作,你正在“重新定义”。 – 2010-07-27 15:49:23

1

据我所知,你在谈论monkeypatching(也被称为在红宝石社区的鸭子冲)。

This article另一个monkeypatching(和其他做法)变差的例子。

+0

鸭子对我来说是一个新的,嘿。 – 2010-07-28 00:31:17