【问题标题】:In scala, how do I get access to specific index in tuple?在 Scala 中,如何访问元组中的特定索引?
【发布时间】:2020-10-01 01:04:04
【问题描述】:

我正在实现获取随机索引并返回元组随机索引处的元素的函数。

我知道对于像 val a=(1,2,3) a._1=2 这样的元组

但是,当我使用随机索引val index=random_index(integer that is smaller than size of tuple) 时,a._index 不起作用。

【问题讨论】:

  • 你想要一个像 Vector 这样的集合而不是 Tuple
  • 那么在元组中,我不能访问随机索引?
  • 不,由于许多原因,不是开箱即用的。元组的想法是你知道有多少元素 (它们可以有不同的类型) 并且每个元素都有一些语义含义,访问随机元素没有多大意义。您可以编写一个小函数,将一些 int 转换为其中一个字段,但同样,您可能希望使用集合。
  • 我认为我的问题与我的意思不同。我编辑了我的问题
  • 不确定有什么区别?

标签: scala tuples


【解决方案1】:

你可以使用productElement,注意它是从零开始的,返回类型是Any

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

【讨论】:

  • 请注意,2 是作为 Any 类型返回的,所以没什么用。
  • @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 非常相似。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-07
    • 2018-01-26
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    • 2018-12-05
    • 2021-03-29
    • 1970-01-01
    相关资源
    最近更新 更多