web-dev-qa-db-ja.com

Mixins vs. Traits

MixinsとTraitsの違いは何ですか?

ウィキペディアによると 、Rubyモジュールは一種の特徴です。どのように?

144
KaptajnKold
  1. ミックスインには状態が含まれる場合がありますが、(伝統的な)特性には含まれません。
  2. ミックスインは「暗黙的な競合解決」を使用し、特性は「明示的な競合解決」を使用します
  3. ミックスインは線形化に依存し、特性は平坦化されます。

特性に関する講義

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。メソッドのセマンティクスは、トレイトで定義されているか、トレイトを使用するクラスで定義されているかに依存しません。

言い換えれば、クラスが特性で構成されているか、特性コードがクラスに「コピー-貼り付け」られているかは問題ではありません。

207
jk_

これらのページでは、Dプログラミング言語の違いについて説明しています。

http://dlang.org/mixin.html

http://dlang.org/traits.html

このコンテキストのミックスインは、その場で生成されたコードであり、コンパイル中にコードのそのポイントに挿入されます。シンプルなDSLには非常に便利です。

特性は、コンパイル時の外部値です(外部ソースから生成されたコードではありません)。違いはわずかです。 Mixinsはロジックを追加し、Traitsはコンパイル時の型情報などのデータを追加します。

Rubyについてはあまり知りませんが、これがいくらか役立つことを願っています。

8
Aiden Bell