Ho riscontrato un comportamento un po 'bizzar negli oggetti che si estende App
. dare un'occhiata al seguente REPL comandi:cosa succede in scala quando si caricano oggetti che estendono l'app?
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
bene, questo è un po 'strano ... ma diventa più strano. Allora ho pensato che le vals in un object
vanno in qualche valutazione pigra ... così ho provato un vero e proprio 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?
così che cosa sta succedendo qui? perché una val regolare ottiene un valore nullo?
perché questo comportamento cambia quando utilizzo lazy val
?
e cosa c'è di così speciale con il tratto App
, che rende i valori normali non valutati?