В чем разница между миксинами и трейтами?
Согласно Википедии, модули Ruby являются чем-то вроде черт. Как же так?
В чем разница между миксинами и трейтами?
Согласно Википедии, модули Ruby являются чем-то вроде черт. Как же так?
ad 1. В миксинах вы можете определять переменные экземпляра. Черты характера не позволяют этого. Состояние должно быть предоставлено составным классом (= класс, использующий черты характера)
объявление 2. Возможен конфликт названий. Два миксина (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'
}
}
В миксинах конфликты в составном классе 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 «скопирован» в класс.
Trait method X has not been applied, because there are collisions with other trait methods
.
- person revo; 13.02.2020
Эти страницы объясняют разницу в языке программирования D.
Примеси в этом контексте - это код, сгенерированный на лету, а затем вставленный в этот момент кода во время компиляции. Очень удобно для простых DSL.
Характеристики - это внешние значения времени компиляции (а не код, созданный из внешнего источника). Разница небольшая. Миксины добавляют логику, черты добавляют данные, такие как информация о типе времени компиляции.
Я мало что знаю о Ruby, но надеюсь, что это немного поможет.