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