Mixins 与 Traits
Posted
技术标签:
【中文标题】Mixins 与 Traits【英文标题】:Mixins vs. Traits 【发布时间】:2010-10-29 20:43:34 【问题描述】:Mixins 和 Traits 有什么区别?
According to Wikipedia,Ruby 模块有点像特征。怎么样?
【问题讨论】:
【参考方案1】:-
mixins 可能包含状态,(传统)特征不包含。
混合使用“隐式冲突解决”,特征使用“显式冲突解决”
混合依赖于线性化,特征被扁平化。
Lecture about traits
广告 1. 在 mixins 中,您可以定义实例变量。特性不允许这样做。必须通过组合类来提供状态(=使用特征的类)
广告 2.
可能存在名称冲突。两个 mixin(MA
和 MB
)或特征(TA
和 TB
)定义具有相同定义的方法 foo():void
。
Mixin MA
foo():void
print 'hello'
Mixin MB
foo():void
print 'bye'
Trait TA
foo():void
print 'hello'
Trait TB
foo():void
print 'bye'
在 mixins 中,组合类 C mixins MA, MB
中的冲突被隐式解决。
Class C mixins MA, MB
bar():void
foo();
这将从MA
调用foo():void
另一方面,在使用 Traits 时,组合类必须解决冲突。
Class C mixins TA, TB
bar():void
foo();
此代码会引发冲突(foo():void
的两个定义)。
广告 3. 方法的语义不取决于它是定义在 trait 中还是在使用该 trait 的类中。
换句话说,无论类是由 Traits 组成还是 Traits 代码被“复制 - 粘贴”到类中都没有关系。
【讨论】:
我知道它已经过去一年了,但是对于未来的读者来说,在 ruby 中它会使用最后一个模块的方法,所以它会从 MB 调用 foo() 在 Scala 中的特征可以有字段,这意味着它们不是“传统”特征? 是的,这些不是“传统的”,它们被称为“有状态的”特征。 statefull trait 和 mixins 之间的区别在于第 2 点和第 3 点。 暂定-1;在野外使用术语“特征”和“混合”的方式非常不一致,至少这里的一点是错误的。 php 和 Wikipedia(根据@Sergio 的说法,还有 Scala)不同意你关于特征是无状态的。我觉得这个答案没有用,因为它是由简单的断言组成的,而且我不清楚这不仅仅是你个人如何使用这些词。否则,我需要看到许多关于这些术语在现实世界中如何使用的例子(例如,在真实的编程语言中)来支持你的主张。 @AykutKllic 线性化 -> “编译器毫无歧义地解决了 super 是什么的问题。” (ibm.com/developerworks/library/j-jn8)【参考方案2】:这些页面解释了 D 编程语言的区别。
http://dlang.org/mixin.html
http://dlang.org/traits.html
此上下文中的 Mixin 是动态生成的代码,然后在编译期间插入到代码中。对于简单的 DSL 来说非常方便。
特征是编译时的外部值(而不是从外部源生成的代码)。差异是微妙的。 Mixins 添加逻辑,Traits 添加编译时类型信息等数据。
对 Ruby 了解不多,但希望对您有所帮助。
【讨论】:
D 中的 Mixins 和 Traits 与计算机科学中这些术语的含义完全不同。在 D 中,两者都是用于自动代码生成的预处理器原语。在其他语言中,它们是继承机制。 D 中的命名决定是不幸的。以上是关于Mixins 与 Traits的主要内容,如果未能解决你的问题,请参考以下文章
SASS 和 Bootstrap - mixins 与 @extend