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(MAMB)或特征(TATB)定义具有相同定义的方法 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 tr​​ait 和 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的主要内容,如果未能解决你的问题,请参考以下文章

Mixins多态绑定方法与非绑定方法

SASS 和 Bootstrap - mixins 与 @extend

SASS 和 Bootstrap - mixins 与 @extend

Jackson Mixins 与 Kotlin

九vue mixins 的用法

未使用 VueJS mixins 定义的属性