0

私たちが持っているとしましょう

scala> trait A { val y: Int; val x = 1; val y2 = y + 1 }

scala> trait B { val y: Int = 1; val x: Int; val x2 = x + 1 }

scala> class C extends A with B

次に、との両方 が の値 2 になるはずです。の値がデフォルトの 0 であるため、 mixin すると値 1 になります。同様に、mixinすると値 1になります。さらに、これらが Int ではなく Object である場合、.y2x2CABy2yx2BANullPointerException

私が理想的な世界で望んでいるのは、初期化が怠惰ではなく、初期化の順序が値の依存グラフによって自動的に暗示されることです。つまり、デフォルト値を使用するのではなく、初期化順序を再シャッフルするようにコンパイラに指示する方法です。さらに、私は特性をより小さな特性にリファクタリングしてから、正しい mixin の順序を自分で解決したくありません (5 つの特性を mixin しなければならない巨大なプロジェクトでは、これを解決するのは苦痛です)。

更新:別の言い方をすれば...特性をミックスするとき、特性を互いに重ね合わせると想像しますが、valsに関しては実際にはこのようには機能しません...このように機能させる方法

更新: それが本当に不可能な場合は、「overlay」と呼ばれるキーワードを scala に追加するという行に沿って使用できるタイプセーフの既存の機能要求チケットへのリンクを誰かが共有できれば幸いです。の:

scala> class C overlay A overlay B
4

1 に答える 1

1

できません。特性は指定された順序で初期化され、それがそうあるべきです。それ以外の理由は考えられません。初期化の順序が最適であるよりも、予測可能であることが重要です。唯一の選択肢は、lazy を使用する (または val ではなく def を使用する) か、このためにトレイトを使用しないことです。

于 2014-11-06T11:53:44.133 に答える