回答
我假设你在谈论重新定义方法,而不是覆盖它们,对吗?如果两个库在两个不同的子类中覆盖相同的方法,则不会有任何问题。
如果两个或多个库重新定义了相同的方法,那么无论哪一个碰巧加载最后的胜者。实际上,这实际上与一个库重新定义方法没有什么不同:Ruby解释器为您提供了一个Array#<<
的实现,如果您重新定义了它,那么您的定义会获胜,这仅仅是因为它稍后出现。
阻止这种情况的最好方法很简单:不要乱动现有方法。并且不要使用那些库。用于启用警告的-w
命令行标志在那里非常有用,因为至少在Ruby 1.9.2中,如果方法得到重新定义,它会打印警告。
在Ruby 2.0中,可能会有某种机制将方法(重新)定义分离成某种类型的命名空间。但我不会屏住呼吸:这些所谓的selector namespaces已经在Ruby社区中讨论了近10年了,在Smalltalk社区中甚至比这个时间还要长,AFAIK从来没有人提供过工作实现,甚至没有人Ruby的工作设计。一个更新的想法是Classboxes的想法。
在实践中,不,如果你真的尝试过,你可能会构建这样的情况。这是一个interesting article(虽然很古老),解释了这可能会发生。
如果两个gem“覆盖了array上的方法<”,则它们需要对Array进行子类化,而这些类将具有不同的名称或位于不同的模块中。
据我所知,你在谈论monkeypatching(也被称为在红宝石社区的鸭子冲)。
This article另一个monkeypatching(和其他做法)变差的例子。
鸭子对我来说是一个新的,嘿。 – 2010-07-28 00:31:17
- 1. Plivo红宝石宝石类冲突
- 2. 冲突的红宝石
- 3. 安装红宝石时名称冲突
- 4. 冲突的红宝石版本
- 5. 有没有办法BDD红宝石鞋?
- 6. 有没有办法修复红宝石的宝石错误?
- 7. 红宝石没有方法错误。
- 8. 红宝石YAML写入没有别名
- 9. 红宝石协会没有Rails的
- 10. 红宝石TK库没有发现
- 11. 红宝石:测试没有运行
- 12. 没有使用rvm安装红宝石
- 13. 红宝石。 OOP。属性没有存储?
- 14. rvm没有设置红宝石版本
- 15. 元素没有与红宝石和硒
- 16. 红宝石 - Open3没有完成子
- 17. 红宝石重开STDIN没有文件
- 18. 宝石版本冲突
- 19. 宝石依赖冲突
- 20. 红宝石:安装宝石,如果用户没有安装它
- 21. 红宝石 - 宝石编辑源代码没有任何影响
- 22. 红宝石有退出吗?
- 23. 有没有可以实现跨平台鼠标操作的红宝石宝石?
- 24. 红宝石在轨道上的继承和多态性冲突
- 25. 红宝石源文件名冲突与'要求'
- 26. 红宝石gemfile休息客户端版本冲突
- 27. 有没有time_from_now宝石?
- 28. 波什干细胞Ubuntu的红宝石,与在/ var/VCAP /波什/ lib中/红宝石(LoadError)冲突
- 29. 红宝石散列在红宝石
- 30. 宝石安装红宝石
实际上,它也发生在实践中。我们曾经有过两种宝石的经验,重新定义了“符号”类的相同方法(其中一个是Sequel,另一个我现在不记得)。不,你不需要在Ruby中继承一个类来重新定义它的方法。 – 2010-07-27 11:51:47
您不必为子类重新定义方法,但是您可以重写它们,这就是问题所在。但你是对的,我误解了这个问题。 – 2010-07-27 13:58:41
我认为在Ruby中重写和重新定义方法并没有什么区别,只是一个命名约定 - 如果您在继承的类中执行该操作,则会“重写”,如果您在已定义的类中执行此操作,你正在“重新定义”。 – 2010-07-27 15:49:23