Во втором фрагменте кода он использует сопоставление с образцом для оценки.
Это переводится в код последующего:
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>)
Это что-то делать с '' A' и B' идентифицируется как «стабильные идентификаторы» Я думаю. Попробуйте: 'val (a, b) = (1, 2)', что действительно. Попробуйте это также, чтобы увидеть: 'val (String, Int) = (1, 2)', который содержит интересные сообщения :) Я не уверен, где/если это определено, но я думаю, что это будет под 'match' и" соответствие шаблону "в SLS. В частности, где говорится о том, как работает совмещение, когда оно называет «unapply». –
Возможный дубликат [Многократное присвоение с помощью сопоставления с массивом не работает с прописными буквами] (http://stackoverflow.com/questions/8204219/multiple-assignment-via-pattern-matching-with-array-is-not- work-with-uppercas) –
@pst Можем ли мы сделать то же самое с 'var'? В Java мы можем делать 'int a, b, c;'. В Scala я хотел бы использовать var (a, b, c): Int', который не работает. – Jus12