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