Was denken Sie, druckt aus?Scala rekursives Val-Verhalten
val foo: String = "foo" + foo
println(foo)
val foo2: Int = 3 + foo2
println(foo2)
Antwort:
foonull
3
Warum? Gibt es einen Teil in der Spezifikation, der dies beschreibt/erklärt?
EDIT: mein Erstaunen Um zu klären - ich erkennen, dass foo
bei val foo: String = "foo" + foo
nicht definiert ist, und das ist, warum es einen Standardwert null
(Null für ganze Zahlen) hat. Aber das scheint nicht sehr "sauber" zu sein, und ich sehe hier Meinungen, die mir zustimmen. Ich hatte gehofft, dass der Compiler mich davon abhalten würde, so etwas zu machen. Es macht in einigen besonderen Fällen Sinn, wie zum Beispiel bei der Definition von 0's, die von Natur aus faul sind, aber für Strings und ganze Zahlen würde ich entweder stoppen, weil ich auf val umgestellt habe, oder mir sagen, dass ich versuche, einen undefinierten Wert zu verwenden , als ob ich schrieb val foo = whatever
(vorausgesetzt, dass whatever
wurde nie definiert).
Um weitere Dinge zu komplizieren, weist @ dk14 darauf hin, dass dieses Verhalten nur für Werte vorhanden ist, die als Felder dargestellt werden und nicht innerhalb von Blöcken auftreten, z.
val bar: String = {
val foo: String = "foo" + foo // error: forward reference extends...
"bar"
}
Welches Verhalten würden Sie erwarten? –
Compiler, der mir sagt, dass er "val" oder etwas ähnlichem zuweist. Oder er sagt mir, dass es nicht weiß, was "foo" ist (weil die lexikalische Analyse des Compilers dieses Token noch nicht gespeichert hat, da es noch nicht vollständig definiert war). Definitiv keinen temporären Wert 'null' geben, der mehr wie JavaScript als Scala klingt (mit undefiniertem statt natürlichem null). – slouc
@slouc bemerken auch den Unterschied im Verhalten beim Ersetzen der 'Val' mit 'def's. – fxlae