1

特定のシナリオでの値クラスまたはケース クラスの使用の違いを発見しようとしています。5 を法とする整数を一意のデータ型としてモデル化するとします。問題は、どちらから始めるべきかということです...

class IntegerMod5(val value: Int) extends AnyVal
case class IntegerMod5(value: Int)

Numericとにかく、かなり簡単にの実装を作成できるようです。ケース クラス アプローチを使用すると、次のように簡単に実行できます。

case class IntegerMod5(value: Int)(implicit ev: Numeric[IntegerMod5]) {
    import ev.mkNumericOps
}

ただし、主な利点はオブジェクトの作成を回避することであるため、値クラスを使用すると、はるかに困難な作業になるようです。したがって、次のようなもの

implicit class IntegersMod5Ops(value: IntegerMod5)(implicit ev: Numeric[IntegerMod5]) {
    import ev.mkNumericOps
}

目的を大きく損なうように見えます。(実際に機能するかどうかはわかりません。)

問題はNumeric、値クラスで使用できるかどうか、または弾丸を噛んでケースクラスを使用する必要があるかどうかです。

4

1 に答える 1

1

implicit ev: Numeric[IntegerMod5]引数としては必要ありません。コンパニオン オブジェクトで定義するだけです。

object IntegerMod5 {
  implicit val numeric: Numeric[IntegerMod5] = ...
}

IntegerMod5s で算術演算を使用すると自動的に取得され、 であるためval、一度だけ初期化されます (object同様に使用できます)。

于 2016-01-01T06:35:21.350 に答える