2011-08-17 2 views
7

sto leggendo la fonte di un project, e ha trovato tale codice non:Perché non impostare il valore direttamente

private var _responded: Boolean = _ 
{ 
    _responded = false 
} 

Non capisco il motivo per cui ha scritto in questo modo, non è lo stesso come:

private var _responded = false 

Qual è la differenza tra loro?

+2

Questo è sconcertante. Mi chiedo se abbia qualcosa a che fare con la linearizzazione di più tratti ereditati. –

+1

Nessuna differenza che io conosca. Forse sarebbe una buona idea chiedere all'autore? –

+0

Re: ereditarietà multipla - scratch che, vars non può essere sovrascritto. –

risposta

7

Sono l'autore di quel codice.

scrittura come questo:

private var _responded = false 

cause questo avvertimento sulla compilazione (con le versioni precedenti di Scala, sembra nessun problema con la Scala 2.9):

the initialization is no longer be executed before the superclass is called 

si può google su questo avvertimento a trovare maggiori informazioni.

6

Qui azzarderò un'ipotesi, ma sembra molto simile al codice prodotto dalla conversione automatica di Java in Scala di intellij.

Questo convertitore tenta di mantenere la semantica del Java originale il più vicino possibile, e quindi tende a produrre codice molto non idiomatico, così come molti ambiti nidificati e variabili mutabili.

+0

Sai come la semantica differisce tra i due (var inizializzato in linea o in un blocco separato)? –

+0

Per la maggior parte degli intenti sono la stessa cosa. Nei prossimi scenari, tuttavia, c'è un rischio (certamente piccolo) di un altro thread che legge il valore non inizializzato quando la dichiarazione e l'assegnazione sono dichiarazioni discrete. –