161

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

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

4

2 に答える 2

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

特徴についてのレクチャー

広告 1. ミックスインでは、インスタンス変数を定義できます。特性はこれを許可しません。状態は、クラス (=トレイトを使用したクラス) を構成することによって提供される必要があります。

ad 2. 名前が競合している可能性があります。2 つの mixin (MAおよびMB) または trait (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();
    }
}

このコードは競合を引き起こします ( の 2 つの定義foo():void)。

ad 3. メソッドのセマンティクスは、それがトレイトで定義されているか、トレイトを使用するクラスで定義されているかに依存しません。

つまり、クラスが Traits で構成されているかどうか、または Traits コードがクラスに「コピー アンド ペースト」されているかどうかは問題ではありません。

于 2011-01-26T09:15:22.263 に答える
9

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

http://dlang.org/mixin.html

http://dlang.org/traits.html

このコンテキストでのミックスインは、オンザフライで生成され、コンパイル中にコードのその時点で挿入されるコードです。単純な DSL には非常に便利です。

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

Rubyについてはよくわかりませんが、少しでも役に立てば幸いです。

于 2009-05-29T11:44:09.043 に答える