#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
Хотя это a(1)
, кажется, очень похоже на стандарт a._1
.