是否可以创建一个案例类,其中一个字段依赖于另一个字段?

时间:2018-02-08 14:23:52

标签: scala case-class

我有一个案例类。

case class A(x: Int)

我需要引入另一个变量y,它取决于x,比如x/2

我能写这样的东西:

case class A(x: Int, y: Int = x/2)

如果没有什么是理想的解决方案?

2 个答案:

答案 0 :(得分:6)

case class A(x: Int) {
  val y = x / 2
}

使用示例:

val a = A(10)
a.x    // 10
a.y    // 5

编辑:如果你的参数中必须有y,那么你可以重载伴随对象中的apply函数:

case class A(x: Int, y: Int)

object A {
  def apply(x: Int): A = new A(x, x / 2)
}

您可以像A(10)一样使用此功能,但请注意,您可以使用A(10, 11)之类的内容调用默认的apply方法。

答案 1 :(得分:2)

您可以有两个参数列表:

 case class Foo(bar: Int)(val baz: Int = bar/2)

缺点是,你必须指定第二个列表,即使它是空的:Foo(2)不起作用,必须是Foo(2)()

一个更大的问题(与case class Foo(x: Int) { val y = x / 2 }方法相同的问题)是第二个val与第一个问题不同:

Foo(2)().toString // returns "Foo(2)"
Foo(2)().productArity  // returns 1 (not 2)
Foo(2)().productIterator.toList // returns List(2) 

您仍然可以显式引用第二个变量,例如println(Foo(2)().baz)(打印1),但通常情况类的东西都不起作用。即使Foo(2)(1) == Foo(2)(4)也会返回true :(

因此,您最好的选择是按照其他答案中的建议重载apply方法。