J'ai obtenu le code suivant se référant par exemple au chapitre 6 de « Programmation Scala »:Pourquoi le résultat est-il différent pour un minuscule changement concernant l'initialisation de val de membre de trait abstrait?
object HelloWorld {
def main(args: Array[String]) {
trait AbstractT2 {
println("In AbstractT2:")
val value: Int
val inverse = 1.0/value // ???
println("AbstractT2: value = " + value + ", inverse = " + inverse)
}
val c2b = new AbstractT2 {
println("In c2b:") //---->line 1
val value = 10 //---->line 2
}
println("c2b.value = " + c2b.value + ", inverse = " + c2b.inverse)
}
}
Le résultat du code ci-dessus est:
In AbstractT2:
AbstractT2: value = 0, inverse = Infinity
In c2b:
c2b.value = 10, inverse = Infinity
Depuis l'initialisation de la classe anonyme est après la l'initialisation des caractères, le résultat est compréhensible. Mais si j'échange ligne 1 et la ligne 2 dans l'exemple ci-dessus, de sorte que val value = 10
précède println("In c2b:")
, le résultat sera:
In AbstractT2:
AbstractT2: value = 10, inverse = 0.1
In c2b:
c2b.value = 10, inverse = 0.1
Il semble que cette fois l'initialisation est réussie mais il est faux du point de vue linguistique. Je ne peux pas comprendre pourquoi. Quelqu'un peut-il aider à ce sujet? Merci beaucoup.
Hmmm .... Scala contre 2.8.0.final vérifiée, et voir les mêmes résultats dans les deux cas: En AbstractT2: AbstractT2: valeur = 0, inverse = infini dans C2B: c2b.value = 10, inverse = Infini –
Je peux confirmer le commentaire de Vasil. Idem ici avec Scala 2.8.0.final. Quelle version utilise-tu? –
La version que j'ai utilisée pour obtenir le résultat ci-dessus est 2.7.7.final. J'ai testé cela contre 2.8.0 tout à l'heure, et les résultats pour les deux cas sont corrects comme vous l'avez dit. Donc, il semble être un bug de 2.7.7 ou 2.7.x? – Hongfei