2012-04-06 16 views
7
val A = 3 
val (A) = (3) 

Ambos correctos. Pero:`val (A) = (3)` es correcto, pero `val (A, B) = (2,3)` no se puede compilar, ¿por qué?

val (A,B) = (2,3) 

no se puede compilar:

scala> val (A,B) = (2,3) 
<console>:7: error: not found: value A 
     val (A,B) = (2,3) 
      ^
<console>:7: error: not found: value B 
     val (A,B) = (2,3) 
      ^

¿Por qué?

+4

Tiene algo que ver con 'A' y 'B' se identifica como "identificadores estables" Creo. Pruebe: 'val (a, b) = (1, 2)', que es válido. Intenta esto también para ver: 'val (String, Int) = (1, 2)', que tiene mensajes interesantes :) No estoy seguro de dónde/si esto está definido, pero creo * que estaría debajo del 'match' y" matching de patrón "en el SLS. En particular, donde se explica cómo funciona la coincidencia cuando se llama a 'unapply'. –

+0

posible duplicado de [La asignación múltiple mediante la coincidencia de patrones con Array no funciona con valores en mayúscula] (http://stackoverflow.com/questions/8204219/multiple-assignment-via-pattern-matching-with-array-is-not- working-with-uppercas) –

+0

@pst ¿Podemos hacer lo mismo con 'var'? En Java podemos hacer 'int a, b, c;'. En Scala, me gustaría 'var (a, b, c): Int', que no funciona. – Jus12

Respuesta

13

En el segundo fragmento de código, utiliza la coincidencia de patrones para realizar la evaluación.

Se traduce al código siguiente:

val Tuple(A, B) = Tuple2(2,3) 

Cuando Scala está haciendo concordancia con el modelo, la variable comienza con una mayúscula en el patrón que se considera como un valor constante (o del objeto Singleton), por lo que val (a, b) = (2, 3) obras pero no val (A, B) = (2, 3).

Por cierto, su primer fragmento de código no usa la coincidencia de patrones, es solo una asignación de variable común.

Si usa Tuple1 explícitamente, tendrá el mismo error.

scala> val Tuple1(Z) = Tuple1(3) 
<console>:7: error: not found: value Z 
     val Tuple1(Z) = Tuple1(3) 

Aquí es algún ejemplo interesante:

scala> val A = 10 
A: Int = 10 

scala> val B = 20 
B: Int = 20 

scala> val (A, x) = (10, 20) 
x: Int = 20 

scala> val (A, x) = (10, 30) 
x: Int = 30 

scala> val (A, x) = (20, 20) 
scala.MatchError: (20,20) (of class scala.Tuple2$mcII$sp) 
    at .<init>(<console>:9) 
    at .<clinit>(<console>) 
+0

'val A = 1' no coincide con el patrón? Pruebe 'val 1 = 2' – Freewind

+0

Quiero decir' 'val (A) = (3)' 'no coincide con el patrón como' 'val (A, B) = (2, 3)' ', se compila con el mismo bytecode como '' val A = 3''. –

Cuestiones relacionadas