在scala trait子类中执行创建代码

时间:2014-03-21 23:04:49

标签: scala traits

我想在val中定义一个trait,它由获得实例化的子类计算一次。

例如:

trait Example
{
    val p : Int
    val after : Int = p + 1
}

class Ex(x : Int) extends Example
{
    val p = x
}

我希望为每个Ex实例计算after,但无论我提供哪个参数xafter始终为1。好像,p为计算0

当然,它适用于def,但它不再只计算一次。

2 个答案:

答案 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