MixinsとTraitsの違いは何ですか?
ウィキペディアによると 、Rubyモジュールは一種の特徴です。どのように?
ad 1。ミックスインでは、インスタンス変数を定義できます。特性はこれを許可しません。状態は、クラス(=特性を使用するクラス)の構成によって提供される必要があります
ad 2。名前が競合している可能性があります。 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();
}
}
_
これは、MA
からfoo():void
を呼び出します
一方、Traitsを使用している間は、クラスを作成することで競合を解決する必要があります。
_Class C mixins TA, TB {
bar():void {
foo();
}
}
_
このコードは競合を引き起こします(foo():void
の2つの定義)。
ad 3。メソッドのセマンティクスは、トレイトで定義されているか、トレイトを使用するクラスで定義されているかに依存しません。
言い換えれば、クラスが特性で構成されているか、特性コードがクラスに「コピー-貼り付け」られているかは問題ではありません。
これらのページでは、Dプログラミング言語の違いについて説明しています。
このコンテキストのミックスインは、その場で生成されたコードであり、コンパイル中にコードのそのポイントに挿入されます。シンプルなDSLには非常に便利です。
特性は、コンパイル時の外部値です(外部ソースから生成されたコードではありません)。違いはわずかです。 Mixinsはロジックを追加し、Traitsはコンパイル時の型情報などのデータを追加します。
Rubyについてはあまり知りませんが、これがいくらか役立つことを願っています。