8

最近誰かが、Scala のトレイトは「真の」トレイトではなく、実際にはただの mixin であると言いました。残念ながら、その理由を聞く機会がありませんでした。彼が何を意味したか分かる人はいますか?

編集: 「特性」の定義として、特性を紹介する Nathanel Schärli の論文とコンセプト ペーパーを参照してきました。ほとんどの mixin や多重継承の実装に欠けていると思われる重要な機能の 1 つは、メソッドをインポートするときにメソッドの名前を変更して衝突やあいまいさを回避する機能です。Scalaはそれを行うことができますか?

4

3 に答える 3

9

おそらく、元の論文で提案されたものとは対照的に、Scala にあるものと関係があると思います。

実装の違いはさておき、私はこの質問についても考えたことがありますが、Scala の特性には実際に何かが必要であるという結論に達しました。Scala でメソッドを作成できるが、メソッドを除外できない方法は奇妙です。競合を避けるために、メソッド解決順序(またはScala で言えば線形化) と呼ばれるものを他の言語から借用していました。多重継承をサポートする言語にはよく知られている問題があり、私は Scala をこのグループのメンバーとして大胆に分類します。問題は、複雑すぎて理解に時間がかかることです。

Scala のメソッド解決順序は奇妙で、メソッド ディスパッチには独自のアルゴリズムがあります。Python で使用されている Dylan の C3 ではなく、いくつかの顕著な問題がありますが、それに関連するすべての問題があります。さらに悪いことに、メソッドを呼び出すことで、Python オブジェクトの MRO を調べることができます.mro()。Scala には同等のものはありません。

メソッドが解決される場所を調べる必要があるたびに、頭の中で Scala MRO アルゴリズムを実行するのはあまり好きではありません。

于 2011-03-09T04:49:31.000 に答える
2

mixin と trait の重要な違いの 1 つは、mixin にはフィールドがあり、trait がないことです。元の論文からの言い換え、特性:

  • 動作を実装するメソッドを提供
  • 提供された動作をパラメータ化するメソッドが必要です
  • フィールドを指定したりアクセスしたりしないでください
  • 対称的に構成されています
  • 入れ子にすることができます。平坦化された特性と同等です

一見すると、3 番目の点は Scala の実装では壊れているように見えます。ただし、特性は、暗黙的なゲッターとセッターによって保護されているパブリック フィールドにのみアクセスできます。この論文は、これがトレイトの実装に受け入れられることを説明しています。

トレイトの重要な機能は、メソッドをインポートするときにメソッドの名前を変更できることだと指摘しました。JVM の制約により、これは不可能です。これに関する首尾一貫した議論はhttp://scala-programming-language.1934581.n4.nabble.com/Trait-method-aliasing-td2322026.html、特に David Pollak による投稿にあります。

最後に、あなたの一般的な質問に対する私の答えは「ある程度」です。詳しく説明すると、Scala トレイトは論文で定義されている厳密なトレイトではありませんが、厳密なミックスインでもありません。いずれにせよ、それらを特性のように使用し、設計原則を守ることがおそらく最善です。

  • それらを再利用する意図で、それらを小さく保ちます。
  • 状態ではなく動作を指定します。
于 2012-04-26T08:18:01.133 に答える
1

いいえ、Scala はインポート時に名前を変更できません。

それがどのように機能するのだろうか。mtrait のメソッドの名前が objectにT変更された場合、が type のパラメーターであり、それを通過した場合、どのように解決されますか?m2op.mpTo

于 2011-03-09T18:44:49.693 に答える