Mixins против черт - PullRequest
       27

Mixins против черт

141 голосов
/ 29 мая 2009

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

Согласно Википедии , модули Ruby являются своего рода чертами. Как так?

Ответы [ 2 ]

204 голосов
/ 26 января 2011
  1. Миксины могут содержать состояние, а (традиционные) - нет.
  2. Миксины используют «неявное разрешение конфликтов», черты используют «явное разрешение конфликтов»
  3. 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'
    }
}

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

Другими словами, не имеет значения, где класс состоит из черт или код черт «скопирован» в класс.

8 голосов
/ 29 мая 2009

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

http://dlang.org/mixin.html

http://dlang.org/traits.html

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

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

Не знаю много о Руби, но надеюсь, что это поможет.

...