我有一个案例类。
case class A(x: Int)
我需要引入另一个变量y
,它取决于x
,比如x/2
。
我能写这样的东西:
case class A(x: Int, y: Int = x/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
方法。