В чем разница между Mixins и чертами?
Согласно Wikipedia, Ruby Modules - это вроде как черты. Как это так?
В чем разница между Mixins и чертами?
Согласно Wikipedia, Ruby Modules - это вроде как черты. Как это так?
объявление 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'
}
}
В mixins конфликты в классе компоновки 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
).
объявление 3. Семантика метода не зависит от того, определена ли она в признаке или в классе, который использует этот признак.
Другими словами, не имеет значения, что класс состоит из черт или кода "Черты", который "скопирован - вставлен" в класс.
Эти страницы объясняют разницу в языке программирования D.
В этом контексте миксины - это код, создаваемый "на лету", а затем вставляемый в эту точку кода во время компиляции. Достаточно удобно для простых DSL.
Черты - это внешние значения времени компиляции (а не код, созданный из внешнего источника). Разница тонкая. Mixins добавляют логику, черты добавляют данные, такие как информация типа времени компиляции.
Не знаю много о Ruby, но надеюсь, что это немного помогает.