Миксины против черт

В чем разница между Mixins и чертами?

Согласно Wikipedia, Ruby Modules - это вроде как черты. Как это так?

Ответ 1

  • Микшины могут содержать состояние, (традиционные) черты не имеют.
  • Mixins использует "неявное разрешение конфликтов", черты используют "явное разрешение конфликтов"
  • Микшины зависят от линеаризации, свойства сплющены.

Лекция о чертах

объявление 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. Семантика метода не зависит от того, определена ли она в признаке или в классе, который использует этот признак.

Другими словами, не имеет значения, что класс состоит из черт или кода "Черты", который "скопирован - вставлен" в класс.

Ответ 2

Эти страницы объясняют разницу в языке программирования D.

http://dlang.org/mixin.html

http://dlang.org/traits.html

В этом контексте миксины - это код, создаваемый "на лету", а затем вставляемый в эту точку кода во время компиляции. Достаточно удобно для простых DSL.

Черты - это внешние значения времени компиляции (а не код, созданный из внешнего источника). Разница тонкая. Mixins добавляют логику, черты добавляют данные, такие как информация типа времени компиляции.

Не знаю много о Ruby, но надеюсь, что это немного помогает.