ChatGPT解决这个技术问题 Extra ChatGPT

Mixins 和 Traits 有什么区别?

According to Wikipedia,Ruby 模块有点像特征。怎么会这样?


c
cngzz1

Mixins 可能包含状态,(传统)特征不包含。 Mixins 使用“隐式冲突解决”,特征使用“显式冲突解决” Mixins 依赖于线性化,特征被扁平化。

Lecture about traits

广告 1. 在 mixins 中,您可以定义实例变量。特性不允许这样做。状态必须由组成类提供(=使用特征的类)

ad 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'
    }
}

在 mixin 中,构成类 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 的两个定义)。

ad 3. 方法的语义不取决于它是定义在特征中还是在使用该特征的类中。

换句话说,无论类是由 Traits 组成还是 Traits 代码“复制 - 粘贴”到类中都没有关系。


我知道这是过去一年的时间,但是对于未来的读者来说,在 ruby 中,它会使用最后一个混合模块的方法,所以它会调用 foo() 形式 MB
在 Scala 特征中可以有字段,这意味着它们不是“传统”特征?
是的,这些不是“传统的”,它们被称为“有状态的”特征。 statefull trait 和 mixins 之间的区别是第 2 点和第 3 点。
暂定-1;在野外使用术语“特征”和“混合”的方式非常不一致,至少这里有一个观点是错误的。 PHP 和 Wikipedia(根据 @Sergio 的说法,还有 Scala)不同意你关于特征是无状态的。我觉得这个答案没有用,因为它是由简单的断言组成的,而且我不清楚这不仅仅是你个人如何使用这些词。否则,我需要看到许多关于如何在现实世界中使用这些术语的示例(例如,在真实的编程语言中)来支持您的主张。
@AykutKllic 线性化-> “编译器毫无歧义地解决了 super 是什么的问题。” (ibm.com/developerworks/library/j-jn8)
f
fooquency

这些页面解释了 D 编程语言的区别。

http://dlang.org/mixin.html

http://dlang.org/traits.html

在这种情况下,mixin 是动态生成的代码,然后在编译期间插入到代码中。对于简单的 DSL 来说非常方便。

特征是编译时的外部值(而不是从外部源生成的代码)。差异是微妙的。 Mixins 添加逻辑,Traits 添加编译时类型信息等数据。

对Ruby不太了解,但希望这会有所帮助。


D 中的 Mixins 和 Traits 与计算机科学中这些术语的含义完全不同。在 D 中,两者都是用于自动代码生成的预处理器原语。在其他语言中,它们是继承机制。 D 中的命名决定是不幸的。