Я полагаю, что следующий отрывок из «Программирование в Scala: всеобъемлющее пошаговое руководство» (Мартин Одерский, Лекс Спун и Билл Веннерс) непосредственно отвечает на оба ваших вопроса:
Доступ к элементам кортежа
Вам может быть интересно, почему вы не можете получить доступ к таким элементам кортежа, как
элементы списка, например, с "pair (0)". Причина в
что метод применения списка всегда возвращает один и тот же тип, но каждый
элемент кортежа может быть другого типа: _1 может иметь один результат
типа, _2 другой, и так далее. Эти числа _N основаны на одном, вместо
с нуля, потому что начинание с 1 является традицией, установленной другими
языки со статически типизированными кортежами, такие как Haskell и ML.
Кортежи Scala получают очень небольшую преференциальную обработку в том, что касается синтаксиса языка, кроме выражений '(' a1, ..., an ')'
, которые обрабатываются компилятором как псевдоним для scala.Tuplen ( a1, ..., * 1013) *) экземпляр класса. В противном случае кортежи ведут себя как любые другие объекты Scala, фактически они записываются в Scala как case-классы, которые варьируются от Tuple2 до Tuple22 . Tuple2 и Tuple3 также известны под псевдонимами Pair и Triple соответственно:
val a = Pair (1,"two") // same as Tuple2 (1,"two") or (1,"two")
val b = Triple (1,"two",3.0) // same as Tuple3 (1,"two",3.0) or (1,"two",3.0)