Миксины противТрейты
-
06-09-2019 - |
Вопрос
В чем разница между миксинами и Признаками?
Согласно Википедии, Модули Ruby - это что-то вроде черт характера.Как же так?
Решение
- Миксины могут содержать государственные черты, а (традиционные) - нет.
- Миксины используют "неявное разрешение конфликтов", черты характера используют "явное разрешение конфликтов".
- Миксины зависят от линеаризации, черты сглажены.
объявление 1. В mixins вы можете определить переменные экземпляра.Черты характера не позволяют этого.Состояние должно быть предоставлено составным классом (=класс, использующий признаки)
объявление 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'
}
}
В миксинах конфликты в классе composing 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
).
объявление 3. Семантика метода не зависит от того, определен ли он в чертеже или в классе, который использует этот признак.
Другими словами, не имеет значения, состоит ли класс из признаков или код признаков "скопирован" в класс.
Другие советы
Эти страницы объясняют разницу в языке программирования D.
Миксины в этом контексте - это код, генерируемый "на лету", а затем вставляемый в этот момент в код во время компиляции.Довольно удобно для простых DSL.
Признаки - это внешние значения во время компиляции (а не код, сгенерированный из внешнего источника).Разница очень тонкая.Микшины добавляют логику, черты характера добавляют данные, такие как информация о типе во время компиляции.
Я мало что знаю о Ruby, но надеюсь, что это хоть немного поможет.