What is the difference between Mixins and Traits?
According to Wikipedia, Ruby Modules are sort of like traits. How so?
See Question&Answers more detail:osWhat is the difference between Mixins and Traits?
According to Wikipedia, Ruby Modules are sort of like traits. How so?
See Question&Answers more detail:osad 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
and MB
) or traits (TA
and TB
) define method with the same definition 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'
}
}
In mixins the conflicts in composing class C mixins MA, MB
are resolved implicitly.
Class C mixins MA, MB {
bar():void {
foo();
}
}
This will call foo():void
from MA
On the other hand while using Traits, composing class has to resolve conflicts.
Class C mixins TA, TB {
bar():void {
foo();
}
}
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.