Mixins in this context are code generated on the fly, and then inserted at that point in code during compilation. Quite handy for simple DSLs.
Traits are compile-time external values (rather than code generated from an external source). The difference is subtle. Mixins add logic, Traits add data such as compile-time type information.
Don't know much about Ruby, but hope this helps somewhat.
Lecture about traits
ad 1. In mixins you can define instance variables. Traits do not allow this. The state must be provided by composing class (=class using the traits)
ad 2. There may be the name conflict. Two mixins (
MA
andMB
) or traits (TA
andTB
) define method with the same definitionfoo():void
.In mixins the conflicts in composing class
C mixins MA, MB
are resolved implicitly.This will call
foo():void
fromMA
On the other hand while using Traits, composing class has to resolve conflicts.
This code will raise conflict (two definitions of
foo():void
).ad 3. The semantics of a method does not depend of whether it is defined in a trait or in a class that uses the trait.
In other words, it does not matter wheter the class consists of the Traits or the Traits code is "copy - pasted" into the class.
These pages explain the difference in the D Programming language.
http://dlang.org/mixin.html
http://dlang.org/traits.html
Mixins in this context are code generated on the fly, and then inserted at that point in code during compilation. Quite handy for simple DSLs.
Traits are compile-time external values (rather than code generated from an external source). The difference is subtle. Mixins add logic, Traits add data such as compile-time type information.
Don't know much about Ruby, but hope this helps somewhat.