Was ist der Unterschied zwischen Mixins und Traits?
Laut Wikipedia sind Ruby-Module ähnliche Eigenschaften. Wie?
Was ist der Unterschied zwischen Mixins und Traits?
Laut Wikipedia sind Ruby-Module ähnliche Eigenschaften. Wie?
Antworten:
ad 1. In Mixins können Sie Instanzvariablen definieren. Eigenschaften erlauben dies nicht. Der Zustand muss durch Zusammenstellen der Klasse (= Klasse unter Verwendung der Merkmale) bereitgestellt werden.
ad 2.
Möglicherweise liegt ein Namenskonflikt vor. Zwei Mixins ( MA
und MB
) oder Merkmale ( TA
und TB
) definieren eine Methode mit derselben Definition 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'
}
}
In Mixins werden die Konflikte beim Erstellen von Klassen C mixins MA, MB
implizit gelöst.
Class C mixins MA, MB {
bar():void {
foo();
}
}
Dies ruft foo():void
ausMA
Andererseits muss das Verfassen von Klassen bei der Verwendung von Merkmalen Konflikte lösen.
Class C mixins TA, TB {
bar():void {
foo();
}
}
Dieser Code führt zu Konflikten (zwei Definitionen von foo():void
).
ad 3. Die Semantik einer Methode hängt nicht davon ab, ob sie in einem Merkmal oder in einer Klasse definiert ist, die das Merkmal verwendet.
Mit anderen Worten, es spielt keine Rolle, ob die Klasse aus den Merkmalen besteht oder der Merkmalscode in die Klasse "kopiert" wird.
Diese Seiten erklären den Unterschied in der Programmiersprache D.
Mixins sind in diesem Zusammenhang Code, der im laufenden Betrieb generiert und an dieser Stelle während der Kompilierung in den Code eingefügt wird. Sehr praktisch für einfache DSLs.
Merkmale sind externe Werte zur Kompilierungszeit (anstelle von Code, der von einer externen Quelle generiert wurde). Der Unterschied ist subtil. Mixins fügen Logik hinzu, Traits fügen Daten wie Informationen zum Typ der Kompilierungszeit hinzu.
Ich weiß nicht viel über Ruby, hoffe aber, dass dies etwas hilft.