3

Scala 2.10は、値クラスのサポートを追加しました。値クラスの制限の1つは、「型が値クラスではないpublic、valパラメーターを1つだけ持つプライマリコンストラクターのみが必要である」ことです。

その単一のvalパラメーターにタプルを使用することの欠点はありますか?

たとえば、開始と終了の期間を表す値型を作成したいと思います。2つのパラメーターを持つことができないため、その範囲をとして表すことができます(Long, Long)

case class Period(timeRange: (Long, Long)) extends AnyVal {
  def start: Long = timeRange._1
  def end: Long = timeRange._2
  def contains(time: Long): Boolean = time >= start && time < end
}

このアプローチを使用しても、値クラスのメモリ割り当てのメリットは得られますか?

4

1 に答える 1

3

欠点は、あなたが言ったように、2 つの sTuple2を格納するために余分なオブジェクトを作成することです。Longボクシングはありませんが、 --Tuple2は に特化していLongます。したがって、この場合はケース クラスを作成した方がよいでしょう。

以下は質問とは直接関係ありませんが、参考になるかもしれません。値クラスがジェネリックである場合、場合によっては型クラスが必要になります。たとえば、型の階乗法を追加したいとし!ますNumeric。次のことを行う必要があります。

implicit class IntegralOps[T: Numeric](val x: T) extends AnyVal {
  def ! = ???
}

型クラスの制約は追加の暗黙のパラメーターに変換され、値クラスは 1 つのパラメーターしかサポートしないため、これは機能しません。

implicit class IntegralOps[T](val x: T)(implicit $evidence: Numeric[T]) extends AnyVal {
  def ! = ???
}

このような場合に回避できるトリックは、typeclass パラメーターをすべての拡張メソッドに移動することです。

implicit class IntegralOps[T](val x: T) extends AnyVal {
  def !(implicit $evidence: Numeric[T]) = ???
}

クラスへの暗黙的な変換とIntegralOps拡張メソッドへの呼び出しで同じ呼び出しサイトが同じであるため、同じ型クラスが両方の場合に適用されます。

于 2013-03-14T12:02:03.667 に答える