2

我试图更好地了解Ruby. 所以 Ruby 提出Mixins了一个一流的概念。在C#一个可以创建Extension Methods的行为上Interfaces。因此,这两种技术都提供了一种广为人知的机制Mixin

在特定示例上比较这两种方法可能会很好。

Ruby 中的可枚举

让我们采用所有那些适用于集合的漂亮方法。在 Ruby 中,这些是,all?等等:http ://ruby-doc.org/core-1.9.3/Enumerable.htmlany?count

来自文档: Enumerable mixin 为集合类提供了几种遍历和搜索方法,并具有排序功能。每个类必须提供一个方法,该方法产生集合的连续成员。

C#中的可枚举

里面有C#一个叫做的特性LINQ,它也提供了这些方法AllAny等等Count

如果你想让你的类“ LINQ enabled”,你需要实现IEnumerable<T>接口,这迫使你还提供一个GetEnumerator在概念上非常接近 ruby​​ 方法的方法。

因此,从鸟的角度来看,您的班级现在获得了上述所有方法。它是怎么发生的?

.NET将所有这些方法定义为接口上的所有LINQ方法。并且由于您实现了这个接口,您现在“混合”了所有这些方法。Extension MethodsIEnumerable<T>

我想知道这两种方法有多大不同,如果有什么事情Ruby Mixins可以做到C#'s Interface+Extension Method战略不能做?Ruby Mixins好吧,除了可以在运行时混合的事实。

4

2 回答 2

4

它们在概念上非常相似,但 C# 的版本更保守——Ruby Mixins 可以访问私有实例变量,并且可以定义私有方法,甚至替换方法。C#扩展方法只能定义公共方法,没有任何特殊的访问权限。

Ruby Mixins 实际上改变了类,而扩展方法是一种方法调度技巧(编译器说,“任何名称为Foo()的实例方法?任何扩展方法?是的?我只是将其作为对这个静态方法的调用发出”)。

另一个区别是扩展方法是scoped,而 Mixins 不是(你不能在 Ruby 文件中指定你想要的 Mixins,一旦它们在其他地方声明,它们就会终身使用)。Ruby 已经讨论过添加它(他们有一些名称,“规范”或其他东西?),但它最终变得相当复杂。

于 2012-09-26T08:36:17.510 回答
0

Mixin 是由其超类参数化的类。与扩展方法根本没有任何关系,因此比较它们甚至没有意义。

于 2012-09-25T14:12:57.720 回答