scala中奇怪的类/特征初始化顺序
为什么下面的代码打印为null,而不是“Test”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
变量
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 = ()