引用特征体Scala中的单位化值

时间:2016-07-06 05:44:35

标签: scala

以下代码如何引发参考错误?

trait T1 {
  println( "  in T1: x = " + x )
  val x=1
  println( "  in T1: x = " + x )
}

class C12 extends T1 {
  println( "  in C12: c = " + c )
  val c="C12"
  println( "  in C12: c = " + c )
}

new C12

相反,似乎x默认为0而c默认为null。这在scala中如何工作?这些变量何时初始化?

1 个答案:

答案 0 :(得分:2)

As explained in the Scala Language Specification

  

声明或定义引入的名称范围是包含绑定的整个语句序列。但是,块中的前向引用存在限制:在组成块的语句序列s1…sn中,如果si中的简单名称引用由sj定义的实体,其中j≥i 1}},然后对于sksi之间的所有sjsk不能是变量定义。如果sk是值定义,则它必须是惰性的。

特质和类体不是块,因此这里没有前向参考限制。

  

这些变量何时初始化?

语句(包括val初始化)只是按顺序执行。