Поиск…


замечания

Почему кортежи ограничены длиной 23?

Кортежи переписываются как объекты компилятором. У компилятора есть доступ к Tuple1 через Tuple22 . Этот произвольный предел был решен разработчиками языка.

Почему количество кортежей подсчитывается от 0?

Tuple0 эквивалентно Unit .

Создание нового кортежа

Кортеж представляет собой разнородный набор из двух-двадцати двух значений. Кортеж можно определить с помощью круглых скобок. Для кортежей размера 2 (также называемого «парой») есть синтаксис стрелки.

scala> val x = (1, "hello") 
x: (Int, String) = (1,hello)
scala> val y = 2 -> "world" 
y: (Int, String) = (2,world)
scala> val z = 3 → "foo"     //example of using U+2192 RIGHTWARD ARROW
z: (Int, String) = (3,foo)

x - кортеж размера два. Чтобы получить доступ к элементам кортежа, используйте ._1 , через ._22 . Например, мы можем использовать x._1 для доступа к первому элементу кортежа x . x._2 обращается ко второму элементу. Более элегантно, вы можете использовать экстракторы кортежей .

Синтаксис стрелки для создания кортежей размера два в основном используется в Картах, которые представляют собой коллекции (key -> value) :

scala> val m = Map[Int, String](2 -> "world")
m: scala.collection.immutable.Map[Int,String] = Map(2 -> world)

scala> m + x
res0: scala.collection.immutable.Map[Int,String] = Map(2 -> world, 1 -> hello)

scala> (m + x).toList
res1: List[(Int, String)] = List((2,world), (1,hello))

Синтаксис для пары на карте - это синтаксис стрелки, дающий понять, что 1 - это ключ, а a - значение, связанное с этим ключом.

Кортежи в коллекциях

Кортежи часто используются в коллекциях, но их нужно обрабатывать определенным образом. Например, учитывая следующий список кортежей:

scala> val l = List(1 -> 2, 2 -> 3, 3 -> 4)
l: List[(Int, Int)] = List((1,2), (2,3), (3,4))

Кажется естественным добавить элементы вместе, используя неявную распаковку:

scala> l.map((e1: Int, e2: Int) => e1 + e2)

Однако это приводит к следующей ошибке:

<console>:9: error: type mismatch;
 found   : (Int, Int) => Int
 required: ((Int, Int)) => ?
              l.map((e1: Int, e2: Int) => e1 + e2)

Scala не может неявно распаковать кортежи таким образом. У нас есть две возможности исправить эту карту. Первый заключается в использовании позиционных аксессуаров _1 и _2 :

scala> l.map(e => e._1 + e._2)
res1: List[Int] = List(3, 5, 7)

Другой вариант - использовать оператор case для распаковки кортежей с использованием сопоставления с образцом:

scala> l.map{ case (e1: Int, e2: Int) => e1 + e2}
res2: List[Int] = List(3, 5, 7)

Эти ограничения применяются для любой функции более высокого порядка, применяемой к набору кортежей.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow