2011-05-06 15 views

Respuesta

7

No realmente. Puede hacer x = y = 0 para establecer varias variables, pero no una asignación paralela como Python. asignación múltiple

+0

¿Es esto lo mismo que usar 'x = 0; y = 0; '? Quiero decir durante la compilación de JIT. –

+0

sí, el código generado es exactamente el mismo. –

+4

Basado en la evaluación derecha-izquierda, debe ser: 'y = 0; x = y; 'De lo contrario,' x = y = new Object(); '¿realmente creará dos objetos? – loungerdork

2

Probar int[] list = {1,2,3}. Esto crea una matriz de enteros con los valores 1, 2 y 3 respectivamente.

+1

necesitaría un 'nuevo int []' antes del '{...' – corsiKa

+3

En realidad, no necesita un 'nuevo int []' antes del inicializador del array, al menos no cuando el inicializador del array es el lado derecho de una tarea. –

6

de Python es bastante potente, ya que también se puede utilizar para la asignación paralelo, como esto:

(x,y) = (y,x) # Swap x and y 

No hay un equivalente para la asignación paralela en Java; que tendría que utilizar una variable temporal:

t = x; x = y; y = t; 

Se pueden asignar varias variables de expresiones en una sola línea como la siguiente:

int a = 1, b = 2, c = 3; 

O al mapa de una matriz, se puede hacer esto:

int a = array[0], b = array[1], c = array[2]; 

Si esto parece demasiado prolijo, puede crear temporalmente una referencia de una letra a la matriz de la misión:

int[] t = array; 
int a = t[0], b = t[1], c = t[2]; 

Para obtener más información sobre la raíz de la pregunta, la asignación múltiple suele ser útil en Python en situaciones donde el código pasa varias variables relacionadas (quizás de diferentes tipos) juntas en una lista o matriz. En Java (o C/C++), la forma más idiomática de hacer esto sería crear una pequeña clase de datos (o estructura) para agrupar estas variables, y hacer que tanto el productor como el consumidor lo utilicen. A continuación, puede hacer referencia a los campos por su nombre en lugar de por el índice, como esto:

class Foo { 
    public int a; 
    public int b; 
    public int c; 
} 

/* ... */ 

Foo produceFoo() { 
    Foo f = new Foo(); 
    f.a = 1; 
    f.b = 2; 
    f.c = 3; 
    return f; 
} 

/* ... */ 

Foo f = produceFoo(); 
System.out.println(f.a + "," + f.b + "," + f.c); 

Esto también abre la puerta a la refactorización más tarde que hará Foo una clase real con el comportamiento y encapsulado de datos privados, no sólo un dato clase.

1

La asignación paralela no sería difícil de agregar a Java, de hecho la implementamos en nuestra extensión de lenguaje OptimJ. Pero simplemente no está allí.

Como Derrick menciona, se requiere una asignación en paralelo para una declaración de intercambio atómico.

Lo que usted llama asignación en paralelo es una instancia de un concepto más general llamado "asignación de desestructuración": usted tiene cierta estructura, y usted combina partes de ella con variables.

Suponga que tiene incrustado tuplas, a continuación, la asignación destructing puede extraer datos en cualquier nivel:

(x, (y, z)) = ((1, 2, 3), (4, (5, 6))) 
// x = (1, 2, 3) 
// y = 4 
// z = (5, 6) 

Suponga que tiene una lista o conjunto, a continuación, asignación desestructurada puede extraer sublistas o subconjuntos (x es un elemento , x * es sinónimo de una lista secundaria):

[ x, y*, z ] = [ 1, 2, 3, 4 ] 
// x = 1 
// y = [ 2, 3 ] 
// z = 4 

Obviamente listas y conjuntos pueden ser integrados con tuplas. Este esquema simple proporciona abstracciones de programación muy potentes, útiles tan pronto como necesite extraer datos.