0

次のようなScalaケースクラスがあると仮定します。

case class Item(
  roundedValue: Double = 0.00)

変数が更新されるたびに、roundedValueに対して次の丸め操作を実行したいと思います。

roundedValue = math.round(roundedValue*100)*0.01

他の言語では、roundedValueのセッターをオーバーライドするだけですが、caseクラス変数のセッターをオーバーライドできないか、コンパイルされないようです。

私が見た解決策の1つは、roundedValueの名前を_roundedValueに変更してプライベートにし、パブリックメソッドを追加してgetterとsetterをシミュレートすることです(丸めロジックを使用):varでsetterをオーバーライドする

ただし、これにより、名前付きパラメーターを使用する場合、caseクラスのコンストラクターの使用がかなり厄介になります。これを行う他の方法はありますか、それともこれはScalaのケースクラスの制限ですか?

4

1 に答える 1

1

機能させることができれば、ケースクラスを不変のままにしておくことをお勧めしますが、新しいインスタンスでミューテーションを行う「コピー」メソッドを作成することをお勧めします。

case class Item(roundedValue: Double = 0.0) {
  def withValue(newValue: Double) = Item(math.round(newValue*100)*0.01)
}

または代わりに、コンパニオン オブジェクトに同様のメソッドが必要な場合もあります。

object Item {
  def withValue(value: Double) = Item(math.round(roundedValue*100)*0.01)
}
于 2012-10-05T21:10:41.287 に答える