2010-07-27 59 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