scala中奇怪的类/特征初始化顺序

scala中奇怪的类/特征初始化顺序,scala,Scala,为什么下面的代码打印为null,而不是“Test” 变量x被初始化为它所属的trait的一部分Testa。此时,您的Testc还不在范围内,因此无法使用在那里定义的方法fun。但是变量已经绑定到该方法。因此,调用Testc时不会打印任何内容 顺便说一下,如果您将x的定义从val x=fun更改为lazy val x=fun,然后在创建对象m后调用此变量,您将看到“test”打印(一次)。但是,x的类型仍然是“Unit”,正如在基本特征中定义的那样 trait Testa { val logi

为什么下面的代码打印为null,而不是“Test”


变量
x
被初始化为它所属的trait的一部分
Testa
。此时,您的
Testc
还不在范围内,因此无法使用在那里定义的方法
fun
。但是变量已经绑定到该方法。因此,调用
Testc
时不会打印任何内容

顺便说一下,如果您将
x
的定义从
val x=fun
更改为
lazy val x=fun
,然后在创建对象
m
后调用此变量,您将看到“test”打印(一次)。但是,x的类型仍然是“Unit”,正如在基本特征中定义的那样

trait Testa {
  val loginurl:String
  def fun
  lazy val x=fun
}

class Testc extends  Testa {
  val loginurl="test"
  def fun={
    println(loginurl)
    1
  }
}

scala> val testc = new Testc
testc: Testc = Testc@4106db23

scala> val testcx = testc.x
test
testcx: Unit = ()

scala> val testcx2 = testc.x
testcx2: Unit = ()
trait Testa {
  val loginurl:String
  def fun
  lazy val x=fun
}

class Testc extends  Testa {
  val loginurl="test"
  def fun={
    println(loginurl)
    1
  }
}

scala> val testc = new Testc
testc: Testc = Testc@4106db23

scala> val testcx = testc.x
test
testcx: Unit = ()

scala> val testcx2 = testc.x
testcx2: Unit = ()