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

Оба правильные. Но:`val (A) = (3)` правильно, но `val (A, B) = (2,3)` не может быть скомпилирован, почему?

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

не может быть скомпилирован:

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) 
      ^

Почему?

+4

Это что-то делать с '' A' и B' идентифицируется как «стабильные идентификаторы» Я думаю. Попробуйте: 'val (a, b) = (1, 2)', что действительно. Попробуйте это также, чтобы увидеть: 'val (String, Int) = (1, 2)', который содержит интересные сообщения :) Я не уверен, где/если это определено, но я думаю, что это будет под 'match' и" соответствие шаблону "в SLS. В частности, где говорится о том, как работает совмещение, когда оно называет «unapply». –

+0

Возможный дубликат [Многократное присвоение с помощью сопоставления с массивом не работает с прописными буквами] (http://stackoverflow.com/questions/8204219/multiple-assignment-via-pattern-matching-with-array-is-not- work-with-uppercas) –

+0

@pst Можем ли мы сделать то же самое с 'var'? В Java мы можем делать 'int a, b, c;'. В Scala я хотел бы использовать var (a, b, c): Int', который не работает. – Jus12

ответ

13

Во втором фрагменте кода он использует сопоставление с образцом для оценки.

Это переводится в код последующего:

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

Когда Scala делает сопоставление с образцом, переменный начинается с верхним регистром в шаблоне рассматриваются как постоянное значение (или одноэлементный объект), так что val (a, b) = (2, 3) работы но не val (A, B) = (2, 3).

BTW, ваш первый фрагмент кода не использует сопоставление с образцом, это просто обычное назначение переменных.

Если вы используете Tuple1 явно, у него будет такая же ошибка.

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

Вот некоторые интересный пример:

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' не соответствует шаблону? Попробуйте 'val 1 = 2' – Freewind

+0

Я имею в виду' 'val (A) = (3)' 'не соответствует шаблону, как' 'val (A, B) = (2, 3)' ', он компилируется в тот же байт-код как '' val A = 3''. –

Смежные вопросы