我在扩展的对象中遇到了一些奇怪的行为App
。查看以下 REPL 命令:
scala> object A extends App {val x = "I am null"}
defined module A
scala> object B {val x = "I am a string"}
defined module B
scala> A.x
res0: java.lang.String = null
scala> B.x
res1: java.lang.String = I am a string
嗯,这有点奇怪……但它变得更奇怪了。然后我认为 vals 在进行object
一些懒惰的评估......所以我尝试了一个真实的lazy val
:
scala> object C extends App {lazy val x = "What am I?"}
defined module C
scala> C.x
res2: java.lang.String = What am I?
那么这里发生了什么?为什么常规 val 得到一个空值?
为什么我使用时这种行为会发生变化lazy val
?
该特征有什么特别之处App
,使常规 vals 不被评估?