3

私はOderskyの本を読んでいて、次のコード部分を含むspeadsheetの例があります。

package org.stairwaybook.scells
    trait Arithmetic { this: Evaluator =>
      operations += (
        "add"  -> { case List(x, y) => x + y },
        "sub"  -> { case List(x, y) => x - y },
        "div"  -> { case List(x, y) => x / y },
        "mul"  -> { case List(x, y) => x * y },
        "mod"  -> { case List(x, y) => x % y },
        "sum"  -> { xs => (0.0 /: xs)(_ + _) },
        "prod" -> { xs => (1.0 /: xs)(_ * _) }
      )
    }

「this:Evaluator」とは何を指しますか?誰かがこの特性を理解するのを手伝ってもらえますか?私が見るように、それは関数であるさまざまな操作を定義しますが、全体像はわかりません...

4

1 に答える 1

11

ここに表示されるもの

this:Evaluator =>

特性の自己型の使用法です。これは基本的に、特性算術を混合しようとしているクラスに、特性エバリュエーターも混合するように強制します。

次のようなクラスを作成しようとした場合:

class ArithmeticClass extends Arithmetic

コンパイル時エラーが発生しますが、実行しようとすると次のようになります。

class ArithmeticClass extends Arithmetic with Evaluator

これはうまくいくでしょう。ご覧のとおり、Arithmeticクラスは、操作に何かを追加するように変更します。これは、おそらくEvaluatorトレイトで定義されたコレクションです。

自己型を使用すると、単純な継承と比較して、よりクリーンなクラス階層を設計できることに注意してください。

セルフタイプを使用する場合は、次のようなことを考えることができます。

trait Evaluator { def runEvaluation : Int }
trait Arithmetic { self: Evaluator => def evaluate: Int = runEvaluation }
trait NullEvaluator extends Evaluator { def runEvaluation: Int = 0 }

class MyClass1 extends Arithmetic with Evaluator {... concrete methods .... }
class MyClass2 extends Arithmetic with NullEvaluator { ....concrete methods ..... }

したがって、自己型を使用すると、継承とは異なる何かを表現できます。

于 2012-07-18T06:53:22.887 に答える