2012-04-09 22 views
13

Al ir a través del libro Scala for the Impatient, me encontré con esta pregunta: ¿x = y = 1 en Scala?

llegado con una situación en la que la asignación x = y = 1 es válido en Scala. (Sugerencia: Elija un tipo adecuado para x.)

No estoy seguro de qué quiere decir exactamente el autor con esta pregunta. La asignación no devuelve un valor, por lo que algo como var x = y = 1 debe devolver Unit() como el valor de x. ¿Puede alguien señalar lo que podría extrañar aquí?

Gracias

+0

Sospecho que el autor * no * pensaba en x como de tipo de Unidad, que por "válido" significaban "y tienen algún propósito". –

Respuesta

12

De hecho, es xUnit en este caso:

var y = 2 
var x = y = 1 

se puede leer como:

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

y finalmente:

var x: Unit =() 
+0

Entonces, ¿el objetivo de esta pregunta es mostrar que var x = y = 1 es válido? –

+10

@sc_ray: * válido * no siempre significa * sensible * ... –

5

Se puede llegar hasta el punto de ser capaz de escribir x=y=1 en la cáscara REPL sin error así:

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

Eso es lo que tenía en mente, excepto que habría escrito 'var x =()' – cayhorstmann

3

Aquí hay otro caso menos conocido que el método de selección devuelve su argumento. Tenga en cuenta que el tipo de x es en realidad Int aquí:

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

import AssignY._ 

var x = y = 1 

(Esta función se utiliza en la biblioteca XScalaWT, y se discutió en that question.)

+1

Claramente, esto no es lo que tenía en mente: -) Pero si quieres soluciones extrañas, ¿qué tal 'implicit unit2int (u: Unit) = 42; var x = 1; var y = 2; x = y = 1' – cayhorstmann

1

Por cierto, si la asignación del mismo valor a ambas aún se requieren variables, entonces use:

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