Tour of Scala

Кортежи

Language

В Scala, кортеж (Тuple) - это контейнер содержащий упорядоченный набор элементов различного типа. Кортежи неизменяемы.

Кортежи могут пригодиться, когда нам нужно вернуть сразу несколько значений из функции.

Кортеж может быть создан как:

val ingredient = ("Sugar", 25)

Такая запись создает кортеж, содержащий пару элементов String и Int.

Выводимый тип ingredient - это (String, Int).

Доступ к элементам

Один из способов доступа к элементам кортежа — по их позиции. tuple._n дает n-ый элемент (столько, сколько существует элементов).

println(ingredient._1) // Sugar
println(ingredient._2) // 25

Один из способов доступа к элементам кортежа — по их позиции. Доступ к отдельным элементам осуществляется с помощью tuple(0), tuple(1) и так далее.

println(ingredient(0)) // Sugar
println(ingredient(1)) // 25

Сопоставление с образцом для кортежей

Кортеж также можно распаковать с помощью сопоставления с образцом:

val (name, quantity) = ingredient
println(name)     // Sugar
println(quantity) // 25

Здесь выводимый тип name - String и выводимый тип quantity - Int.

Вот еще один пример сопоставления с образцом кортежа:

val planets =
  List(("Mercury", 57.9), ("Venus", 108.2), ("Earth", 149.6),
       ("Mars", 227.9), ("Jupiter", 778.3))
planets.foreach {
  case ("Earth", distance) =>
    println(s"Our planet is $distance million kilometers from the sun")
  case _ =>
}

Или, в for-comprehension:

val numPairs = List((2, 5), (3, -7), (20, 56))
for ((a, b) <- numPairs) {
  println(a * b)
}
val numPairs = List((2, 5), (3, -7), (20, 56))
for (a, b) <- numPairs do
  println(a * b)

Кортежи и кейс-классы

Иногда бывает трудно выбирать между кортежами и кейс-классами. Кейс-классы содержат именованные элементы. Имена могут улучшить читаемость некоторых типов кода. В приведенном выше примере мы могли бы определить планеты, как case class Planet(name: String, distance: Double), а не использовать кортежи.

Дополнительные ресурсы

  • Дополнительная информация о кортежах - в книге Scala Book

Contributors to this page: