解构Scala中的复合元组

时间:2015-03-27 14:26:18

标签: scala

我有一个函数返回一个元组,其中一个项目也是一个元组。

def foo: (Any, (Any, Any))

实际的类型并不是真正的Any,但这是对实际代码的简化(因此我为了这个问题而将其复制为一个复合元组)。

现在我解释这个元组如下,希望用a1,a2,a3进行计算。

val (a1, bar) = foo
val (a2, a3) = bar

这是否有一个班轮?

3 个答案:

答案 0 :(得分:5)

当然!你可以用同样的方式匹配它。

def foo: (Any, (Any, Any)) = (1, (2, 3))

scala> val (a1, (a2, a3)) = foo
a1: Any = 1
a2: Any = 2
a3: Any = 3

这是有效的,因为您有Tuple2[Any, Tuple2[Any, Any]]Tuple2定义了unapply方法,允许此模式匹配发生。

答案 1 :(得分:3)

很简单:

val (a1, (a2, a3)) = foo

答案 2 :(得分:1)

旁注,嵌套元组可以被提取/模式匹配,并通过这样的理解进一步计算,

val x = (1,(2,3))
for ( (a,(b,c)) <- Seq(x) ) yield a+b+c

还要考虑匹配类型,

val y = (1,("bb",3))
for ( (_,(b:String,_)) <- Seq(x) ) yield b

或与已经描述的类似,

val (a:Int, (b: Double, c: String)) = (1, (2.0, "ccc"))
a: Int = 1
b: Double = 2.0
c: String = ccc