Mixins と Traits の違いは何ですか?
ウィキペディアによると、Ruby モジュールは一種の特性です。どうして?
Mixins と Traits の違いは何ですか?
ウィキペディアによると、Ruby モジュールは一種の特性です。どうして?
広告 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 コードがクラスに「コピー アンド ペースト」されているかどうかは問題ではありません。
これらのページでは、D プログラミング言語の違いについて説明します。
このコンテキストでのミックスインは、オンザフライで生成され、コンパイル中にコードのその時点で挿入されるコードです。単純な DSL には非常に便利です。
特性は、(外部ソースから生成されたコードではなく) コンパイル時の外部値です。違いは微妙です。Mixin はロジックを追加し、Traits はコンパイル時の型情報などのデータを追加します。
Rubyについてはよくわかりませんが、少しでも役に立てば幸いです。