2012-09-25 83 views
1

我想要更好地瞭解Ruby。所以Ruby使Mixins成爲一流的概念。在C#中,人們可以創建Extension Methods,其作用於Interfaces。所以這兩種技術都提供了一種廣爲人知的機制,即Mixin有什麼Ruby Mixins可以做什麼C#僞Mixins(接口+擴展方法)不能?

在特定示例上比較兩種方法可能比較好。

可枚舉在Ruby中

讓我們所有的在收集工作了那些美麗的方法。在Ruby這些都是all?any?count和更大量的:http://ruby-doc.org/core-1.9.3/Enumerable.html

從文檔: 可枚舉混入提供的集合類與幾個遍歷和搜索方法,以及排序的功能。這個類必須提供一個方法,每個方法都會產生收集的連續成員。

在C#中可枚舉

C#有一個叫LINQ,它也提供這些方法AllAnyCount和更多的功能。

如果你想讓你的課程「LINQ enabled」你需要實現IEnumerable<T>界面,這迫使你也提供一個方法GetEnumerator它在概念上非常接近ruby方法。

所以從鳥類的角度來看,你的課程現在獲得了上面提到的所有方法。它是怎麼發生的?

好吧.NETIEnumerable<T>接口上定義了所有那些LINQ方法爲Extension Methods。而且,由於你實現了這個接口,你現在「混入」所有這些方法。

我想知道這兩種方法的差異程度,如果有事情Ruby Mixins能做到這一點C#'sInterface + Extension Method策略不能?那麼,除了Ruby Mixins可以在運行時混合的事實。

回答

2

它們在概念上非常相似,但C#的版本更保守--Ruby Mixins可以訪問私有實例變量,並且可以定義私有方法,甚至可以替換方法。 C#擴展方法只能定義公共方法,並沒有任何特殊的訪問權限。

紅寶石混入實際上變化類,而擴展方法的方法調度招(編譯器說,「任何實例方法與名稱美孚()?任何擴展方法嗎?是的?我就發出這作爲對這個靜態方法的調用「)。其他

一個不同之處,在於擴展方法作用域,而混入不(你不能指定你想要的混入在Ruby文件,一旦他們宣稱別的地方,他們正在狂奔的生活) 。 Ruby已經談到了添加這個(他們有一些名字,「規範」或什麼?),但它最終是相當複雜的。

1

Mixins是由它們的超類來參數化的類。實際上根本沒有任何關係到擴展方法,所以比較它們甚至沒有意義。

+0

我澄清了這個問題。希望現在更清楚。 – Christoph

相關問題