2012-04-09 26 views
13

Mentre passa attraverso il libro Scala for the Impatient, mi sono imbattuto in questa domanda:x = y = 1 in Scala?

venire con una situazione in cui l'assegnazione x = y = 1 è valido Scala. (Suggerimento: selezionare un tipo adatto per x.)

Non sono sicuro di ciò che l'autore intende esattamente con questa domanda. Il compito non restituisce un valore, quindi qualcosa come var x = y = 1 dovrebbe restituire Unit() come valore di x. Qualcuno può far notare cosa potrei mancare qui?

Grazie

+0

ho il forte sospetto che l'autore era * non * è il pensiero di x come di tipo Unit - che "valido", hanno significato per implicare "e avere qualche scopo". –

risposta

12

Infatti, x è Unit in questo caso:

var y = 2 
var x = y = 1 

può essere letta come:

var y = 2 
var x = (y = 1) 

ed infine:

var x: Unit =() 
+0

Quindi l'intero punto di questa domanda è mostrare che var x = y = 1 è valido? –

+10

@sc_ray: * valido * non sempre significa * ragionevole * ... –

5

Si può arrivare al punto di essere in grado di digitare x=y=1 nel guscio REPL senza errori così:

var x:Unit = {} 
var y = 0 
x = y = 1 
+2

Questo è quello che avevo in mente, tranne che avrei scritto 'var x =()' – cayhorstmann

3

Ecco un altro caso meno noto in cui il metodo setter ritorna il suo argomento. Si noti che il tipo di x è effettivamente Int qui:

object AssignY { 
    private var _y: Int = _ 
    def y = _y 
    def y_=(i: Int) = { _y = i; i } 
} 

import AssignY._ 

var x = y = 1 

(Questa funzione viene utilizzata nella libreria XScalaWT, ed è stato discusso in that question.)

+1

Chiaramente, questo non è quello che avevo in mente: -) Ma se vuoi delle soluzioni strane, che ne dite di 'implicit def unit2int (u: Unit) = 42; var x = 1; var y = 2; x = y = 1' – cayhorstmann

1

proposito se assegnare lo stesso valore sia variabili ancora necessari quindi utilizzare:

 
scala> var [email protected] = 1 
x: Int = 1 
y: Int = 1 
Problemi correlati