Mixins 和 Traits 有什么区别?
According to Wikipedia,Ruby 模块有点像特征。怎么会这样?
Mixins 可能包含状态,(传统)特征不包含。 Mixins 使用“隐式冲突解决”,特征使用“显式冲突解决” Mixins 依赖于线性化,特征被扁平化。
广告 1. 在 mixins 中,您可以定义实例变量。特性不允许这样做。状态必须由组成类提供(=使用特征的类)
ad 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'
}
}
在 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 代码“复制 - 粘贴”到类中都没有关系。
这些页面解释了 D 编程语言的区别。
在这种情况下,mixin 是动态生成的代码,然后在编译期间插入到代码中。对于简单的 DSL 来说非常方便。
特征是编译时的外部值(而不是从外部源生成的代码)。差异是微妙的。 Mixins 添加逻辑,Traits 添加编译时类型信息等数据。
对Ruby不太了解,但希望这会有所帮助。