回答
我假設你在談論重新定義方法,而不是覆蓋它們,對嗎?如果兩個庫在兩個不同的子類中覆蓋相同的方法,則不會有任何問題。
如果兩個或多個庫重新定義了相同的方法,那麼無論哪一個碰巧加載最後的勝者。實際上,這實際上與一個庫重新定義方法沒有什麼不同: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. 紅寶石rbenv寶石沒有找到
- 6. 紅寶石寶石:sudo寶石沒有用寶石顯示
- 7. 紅寶石沒有右表
- 8. 安裝紅寶石時名稱衝突
- 9. 衝突的紅寶石版本
- 10. 紅寶石生成器衝突
- 11. 紅寶石模塊名稱衝突
- 12. 紅寶石1.8.7&紅寶石2沒有rmv,失敗instalation
- 13. 有沒有辦法BDD紅寶石鞋?
- 14. 有沒有{| x | x}紅寶石速記?
- 15. PHP有沒有像紅寶石寶石捆綁器?
- 16. 有沒有辦法修復紅寶石的寶石錯誤?
- 17. 當地的寶石資料庫?安裝沒有'寶石'的紅寶石寶石?
- 18. 元素沒有與紅寶石和硒
- 19. 紅寶石:測試沒有運行
- 20. 沒有使用rvm安裝紅寶石
- 21. 紅寶石沒有讀取database.yml文件
- 22. AWS紅寶石,好像沒有安裝
- 23. 紅寶石`ensure`沒有運行
- 24. 升級紅寶石版本沒有rvm
- 25. 紅寶石評估沒有評估?
- 26. 紅寶石+ Testunit + ci_reporter:沒有XML輸出
- 27. 紅寶石YAML寫入沒有別名
- 28. pik沒有列出紅寶石1.9.3
- 29. 紅寶石協會沒有Rails的
- 30. 紅寶石。 OOP。屬性沒有存儲?
實際上,它也發生在實踐中。我們曾經有過兩種寶石的經驗,重新定義了「符號」類的相同方法(其中一個是Sequel,另一個我現在不記得)。不,你不需要在Ruby中繼承一個類來重新定義它的方法。 – 2010-07-27 11:51:47
您不必爲子類重新定義方法,但是您可以重寫它們,這就是問題所在。但你是對的,我誤解了這個問題。 – 2010-07-27 13:58:41
我認爲在Ruby中重寫和重新定義方法並沒有什麼區別,只是一個命名約定 - 如果您在繼承的類中執行該操作,則會「重寫」,如果您在已定義的類中執行此操作,你正在「重新定義」。 – 2010-07-27 15:49:23