为什么不能遍历Scala中的元组?

Yan*_*kee 0 scala tuples traversal

假设我创建了一个Tuple6:

val tup = (true, 1 , "Hello" , 0.4 , "World" , 0 )
tup: (Boolean, Int, String, Float, String, Int)
Run Code Online (Sandbox Code Playgroud)

而且我可以访问使用数组的元素._<position>tup._1tup._2等.但为什么呢

for (i <- 1 to 6)
     println(tup._i)
Run Code Online (Sandbox Code Playgroud)

给我一个错误的说法

value _i is not a member of (String, Int, Boolean, String, Double, Int)
Run Code Online (Sandbox Code Playgroud)

我明白,有明确说明元组不可迭代,但如果._1有效,不应该._i以相同的方式工作吗?

mik*_*łak 8

这一切归结为类型.

你喜欢什么类型的动态访问器_<position>?在一般情况下,唯一有效的是Any.在诸如Scala之类的强类型语言中,这对于大多数目的来说是无用的.

好消息是,这个问题可以在一个类型安全的方式进行处理-例如见HList风格的元组处理无形.

但是,标准的Scala库中没有这样的机制(除了重大的元编程,如宏).


mak*_*aks 6

对于元组,有一种productIterator方法可以让您有机会迭代元组的元素.但显然这种迭代的每个元素都是类型的Any