3

Scala では、次のように初期定義を行うことができます。

trait A {
  val v: Int
}

class B extends { val v = 4 } with A

この機能の使用例は何ですか?

4

3 に答える 3

2

Programming in Scala book (page 451)の例を見てみましょう。次のような定義があるとします。

trait RationalTrait {
   val numerArg: Int
   val denomArg: Int
}

次に、numerArg と denomArg は抽象 val と呼ばれ、次のように、この特性を extends なしで直接使用できます。

val x = new RationalTrait {
   val numerArg = 1
   val denomArg = 2
}

または

val y = new {
   val numerArg = 1
   val denomArg = 1
} with RationalTrait

上記の 2 つは両方とも有効です。式の値を抽象 val に配置する必要がある場合を除き、次のように後の形式のみを使用できます。

val z = new {
  val numerArg = 1 * x
  val denomArg = 2 * x
} with RationalTrait

book のもう 1 つの興味深い例は、クラス定義のフィールドを事前に初期化することです。

class RationalClass(n: Int, d: Int) extends {
  val numerArg = n
  val denomArg = d
} with RationalTrait {
  def + (that: RationalClass) = new RationalClass(
    numer * that.denom + that.numer * denom,
    denom * that.denom
  )
}
于 2013-05-03T07:12:33.893 に答える
2

値が特性の初期化に使用されるときはいつでも。したがって、この特性の例:

trait UsefulTrait {
  val parameter : Int
  private val myHelperObject = new MyExpensiveClass(parameter)
}

このパラメーターは、コンストラクター パラメーターの代わりに使用されます。ただし、パラメーターは、実装者により多くの空き領域を残すため、むしろ抽象メソッドにする必要があります。

于 2013-05-02T23:31:44.203 に答える