Как создать кортеж из всех элементов, представленных в массиве - PullRequest
0 голосов
/ 09 февраля 2020

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

Количество элементов не более 22.

1 Ответ

1 голос
/ 10 февраля 2020

К сожалению, вы не можете сделать это безопасным способом. Артерии кортежей должны быть известны во время компиляции. Длина вашего массива известна только во время выполнения, так как коллекции имеют произвольную длину.

Возможно, вы захотите потом что-нибудь сделать с этими кортежами. Проблема в том, что вам нужно написать код, который обрабатывает все случаи кортежей, такие как:

array match {
  case Array(first)=> ???
  case Array(first, second) => ???
  case Array(first, second, third) => ???
      ...
  case Array(first, second, third, fourth, fifth, sixth, seventh, .... twentysecond) => ???
  case _ => // What to do now?
}

Это так, потому что мы не знаем, что может быть результатом этого массива -> операция кортежа в compile- время, поэтому мы рассмотрим все случаи.

Если мы знаем, сколько элементов у нашего массива во время компиляции, мы можем использовать Shapeless , чтобы сделать что-то подобное ниже, как ответили в другом вопрос

import shapeless._
import HList._
import syntax.std.traversable._

val x = List(1, 2, 3)
val y = x.toHList[Int::Int::Int::HNil]
val z = y.get.tupled
...