В scala, как мне получить доступ к определенному индексу в кортеже?

#scala #tuples

#scala #Кортежи

Вопрос:

Я реализую функцию, которая получает случайный индекс и возвращает элемент со случайным индексом кортежа.

Я знаю, что для кортежа, подобного, val a=(1,2,3) a._1=2

Однако, когда я использую случайный индекс val index=random_index(integer that is smaller than size of tuple) , a._index не работает.

Комментарии:

1. Вам нужна коллекция, похожая на вектор , а не на кортеж .

2. Тогда в кортеже я не могу получить доступ к случайному индексу?

3. Нет, ну не из коробки по многим причинам. Идея кортежей заключается в том, что вы знаете, сколько существует элементов (и они могут иметь разные типы) , и каждый элемент имеет некоторое семантическое значение, доступ к случайному элементу не имеет особого смысла. Вы можете написать небольшую функцию, которая преобразует некоторый int в одно из полей, но опять же, вы, вероятно, захотите использовать вместо этого коллекцию.

4. Я думаю, что мой вопрос отличался от того, что я имел в виду.. Я отредактировал свой вопрос

5. Не уверен, в чем разница?

Ответ №1:

Вы можете использовать productElement , обратите внимание, что он основан на нуле и имеет возвращаемый тип Any :

 val a=(1,2,3)
a.productElement(1) // returns 2nd element
  

Комментарии:

1. Обратите внимание, что 2 это возвращается как тип Any , поэтому довольно бесполезно.

2. @Choi Для того, чтобы вернуть не только Any , но Int индекс должен быть известен во время компиляции (кортеж может быть (1.0, 2, 3L) ). Смотрите подробности в моем ответе.

Ответ №2:

Если вы знаете random_index только во время выполнения, лучшее, что у вас может быть (как ответил @GuruStron)

 val a = (1,2,3)
val i = 1
val x = a.productElement(i)
x: Any // 2
  

Если вы знаете random_index , что во время компиляции вы можете сделать

 import shapeless.syntax.std.tuple._
val a = (1,2,3)
val x = a(1)
x: Int // 2   // not just Any
// a(4) // doesn't compile
val i = 1
// a(i) // doesn't compile
  

https://github.com/milessabin/shapeless/wiki/Feature-overview:-shapeless-2.0.0#hlist-style-operations-on-standard-scala-tuples

Хотя это a(1) , кажется, очень похоже на стандарт a._1 .