В чем разница между миксинами и чертами?
Согласно Википедии , Рубиновые Модули являются своего рода чертами. Как так?
В чем разница между миксинами и чертами?
Согласно Википедии , Рубиновые Модули являются своего рода чертами. Как так?
Ответы:
Объявление 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
С другой стороны, при использовании черт, составление класса должно разрешать конфликты.
Class C mixins TA, TB {
bar():void {
foo();
}
}
Этот код вызовет конфликт (два определения foo():void
).
ad 3. Семантика метода не зависит от того, определен он в признаке или в классе, который использует признак.
Другими словами, не имеет значения, является ли класс состоящим из черт или код черт «вставляется» в класс.
Эти страницы объясняют разницу в языке программирования D.
Миксины в этом контексте - это код, сгенерированный на лету, а затем вставленный в этот момент в код во время компиляции. Довольно удобно для простых DSL.
Черты - это внешние значения времени компиляции (а не код, сгенерированный из внешнего источника). Разница неуловима. Миксины добавляют логику, Черты добавляют данные, такие как информация о типе времени компиляции.
Не знаю много о Руби, но надеюсь, что это поможет.