2016-09-28 2 views
0

Je suis complètement nouveau à Scala. Je suis confus au comportement de lazy val dans REPL.Scala paresseux VAL évalue réellement l'expression pour obtenir le type final pendant l'affectation

scala> lazy val a = {println("Hello, World!!!"); 5} 
a: Int = <lazy> 

scala> a 
Hello, World!!! 
res0: Int = 5 

Je peux voir que, dans le REPL, le type de lazy vala a été attribué correctement, immédiatement après la déclaration.

Maintenant, ma question, est interprète Scala évalue réellement l'expression paresseusement, ou évalue juste, mais ne stocke pas la valeur résultante évaluée à la variable prévue.

Merci d'avance.

Répondre

4

Réponse courte: non. Réponse plus longue: l'algorithme d'inférence de type n'a pas besoin d'exécuter le code, il doit seulement analyser l'arbre de syntaxe abstraite (la représentation structurée de votre code produit par l'analyseur) pour en déduire le type et lazy val .

3

Maintenant, ma question, est l'interprète Scala évalue en fait l'expression paresseusement, ou tout simplement évalue, mais ne stocke pas la valeur résultante évaluée à la variable destinée.

Il est facile de voir qu'il doit être le premier, car si elle était la deuxième, Hello, World!!! serait imprimé deux fois.