我想在val
中定义一个trait
,它由获得实例化的子类计算一次。
例如:
trait Example
{
val p : Int
val after : Int = p + 1
}
class Ex(x : Int) extends Example
{
val p = x
}
我希望为每个Ex实例计算after
,但无论我提供哪个参数x
,after
始终为1
。好像,p
为计算0
。
当然,它适用于def,但它不再只计算一次。
答案 0 :(得分:3)
after
中的{p> Example
会立即实例化,然后才能实际Ex
实例化 - 然后再查看x
。
要解决此问题,您可以将after
变为lazy val
,并在首次使用时对其进行评估。
答案 1 :(得分:2)
首先,val
变量是不可变的,因此只能分配一次。所以不可能做p = x
。但是,如果您在val p = x
班级中Ex
进行了分配您刚刚定义的其他变量,那么after
就不会发生变化。
您必须在var p
类中定义抽象变量Ex
,以便能够设置val p
中定义的Example
。例如,在构造函数中定义var p
,如下所示。
trait Example
{
val p : Int
val after : Int = p + 1
}
class Ex(val p : Int) extends Example
演示
scala> val ex = new Ex(5)
ex: Ex = Ex@1f7ebc89
scala> ex.p
res4: Int = 5
scala> ex.after
res5: Int = 6