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

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

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


person KaptajnKold    schedule 29.05.2009    source источник


Ответы (2)


  1. Миксины могут содержать состояние, (традиционные) черты - нет.
  2. Миксины используют «неявное разрешение конфликтов», черты используют «явное разрешение конфликтов».
  3. Примеси зависят от линеаризации, черты сглаживаются.

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

ad 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

С другой стороны, при использовании Traits составной класс должен разрешать конфликты.

Class C mixins TA, TB {
    bar():void {
        foo();
    }
}

Этот код вызовет конфликт (два определения foo():void).

ad 3. Семантика метода не зависит от того, определен ли он в характеристике или в классе, который использует эту характеристику.

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

person jk_    schedule 26.01.2011
comment
Я знаю, что это год назад, но для будущих читателей в Ruby он будет использовать метод из последнего модуля, который был добавлен, поэтому он будет вызывать foo () из MB - person rik.vanmechelen; 12.01.2012
comment
в Scala у трейтов могут быть поля, это означает, что они не являются традиционными трейтами? - person Sergio; 20.09.2012
comment
Да, это не традиционные, их называют statefull traits. Разница между трейтами с сохранением состояния и миксинами - это пункты 2 и 3. - person jk_; 24.09.2012
comment
Что вы имеете в виду под линеаризацией? - person Aykut Kllic; 16.09.2013
comment
Черты afaik Scala действительно зависят от линеаризации. - person Sergio; 03.11.2013
comment
Ориентировочно -1; То, как термины «черта» и «миксин» используются в дикой природе, очень непоследовательно, и, по крайней мере, один из пунктов здесь в основном неверен. PHP и Википедия (и, согласно @Sergio, также Scala) не согласны с вами в том, что черты не имеют состояния. Я не считаю этот ответ полезным, потому что он состоит из простых утверждений, и мне неясно, что это что-то большее, чем то, как вы лично используете эти слова. Чтобы убедиться в обратном, мне нужно увидеть много примеров того, как эти термины используются в реальном мире (например, в реальных языках программирования), чтобы подтвердить ваши утверждения. - person Mark Amery; 13.03.2014
comment
@AykutKllic Линеаризация - ›Компилятор решает вопрос о том, что такое супер, без двусмысленности. (ibm.com/developerworks/library/j-jn8) - person ben; 24.10.2014
comment
Не могли бы вы подробнее рассказать о части Mixins, зависящей от линеаризации, черты сглаживаются? Я не уверен, понимаю ли я это. - person Adam Arold; 31.07.2015
comment
Неверно, что разрешение конфликтов наследования методов с помощью свойств должно обрабатываться явно. В PHP свойства обрабатываются неявно. - person Sebi2020; 20.09.2018
comment
@ Sebi2020 Это неправильно. PHP выдает фатальную ошибку Trait method X has not been applied, because there are collisions with other trait methods. - person revo; 13.02.2020
comment
был ли этот ответ специфичным для одного языка или в целом применялся к разным (если есть какие-либо различия) между двумя терминами? - person dragonxlwang; 09.01.2021

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

http://dlang.org/mixin.html

http://dlang.org/traits.html

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

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

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

person Aiden Bell    schedule 29.05.2009
comment
Примеси и черты в D полностью отличаются от того, что означают эти термины в компьютерных науках в целом. В D оба являются примитивами препроцессора для автоматической генерации кода. В других языках это механизмы наследования. Решение об именовании в D неудачное. - person tylerl; 24.02.2012