Яка різниця між Мікінсом і Трайсом?
Згідно з Вікіпедією , модулі Ruby є подібними до рис. Як так?
Яка різниця між Мікінсом і Трайсом?
Згідно з Вікіпедією , модулі Ruby є подібними до рис. Як так?
Відповіді:
оголошення 1. У комбінаціях можна визначити змінні екземпляра. Риси цього не дозволяють. Держава повинна забезпечуватися складанням класу складання (= клас з використанням ознак)
ad 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
).
ad 3. Семантика методу не залежить від того, визначений він у ознаці чи в класі, який використовує ознаку.
Іншими словами, не має значення, з якого класу складається ознаки, або код "Штату" "копіюється - вставляється" в клас.
Ці сторінки пояснюють різницю мови програмування D.
Міксини в цьому контексті коду генеруються під час руху, а потім вставляються в цей момент у коді під час компіляції. Досить зручно для простих DSL.
Риси - це зовнішні значення компіляції за часом (а не код, що генерується із зовнішнього джерела). Різниця тонка. Mixins додає логіку, Traits додає такі дані, як інформація про тип компіляції.
Не знаю багато про Рубі, але сподіваюся, що це дещо допомагає.