Mixins 和 Traits 有什么区别?
根据 Wikipedia,Ruby 模块有点像特征。怎么会这样?
Mixins 和 Traits 有什么区别?
根据 Wikipedia,Ruby 模块有点像特征。怎么会这样?
广告 1. 在 mixins 中,您可以定义实例变量。特性不允许这样做。必须通过组合类来提供状态(=使用特征的类)
ad 2.
可能存在名称冲突。两个 mixin ( MA
and MB
) 或 traits ( TA
and 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();
}
}
这foo():void
将从MA
另一方面,在使用 Traits 时,组合类必须解决冲突。
Class C mixins TA, TB {
bar():void {
foo();
}
}
此代码将引发冲突(的两个定义foo():void
)。
ad 3. 方法的语义不取决于它是定义在特征中还是在使用该特征的类中。
换句话说,无论类是由 Traits 组成还是 Traits 代码“复制 - 粘贴”到类中都没有关系。
这些页面解释了 D 编程语言的区别。
在这种情况下,mixin 是动态生成的代码,然后在编译期间插入到代码中。对于简单的 DSL 来说非常方便。
特征是编译时的外部值(而不是从外部源生成的代码)。差异是微妙的。Mixins 添加逻辑,Traits 添加编译时类型信息等数据。
对Ruby不太了解,但希望这会有所帮助。