2009-11-09 10 views
9
scala> val l = List((1,2), (2,3)) 
l: List[(Int, Int)] = List((1,2), (2,3)) 

que puede hacerlista de tuplas veces en Scala con desestructuración

scala> (0 /: l) {(a, i) => i._1 + a} 
res20: Int = 3 

Pero yo quiero ser capaz de nombrar los elementos de la tupla. Algo así como:

scala> (0 /: l) {(a, (b,c)) => b + a} 
<console>:1: error: not a legal formal parameter 
     (0 /: l) {(a, (b,c)) => b + a} 
        ^

Sé que puedo hacer:

scala> (0 /: l) {(a, i) => val (b, c) = i; b + a} 
res0: Int = 3 

Pero hay una manera de hacer que el código sea más concisa (mi código real implica varias de tales pliegues y no me gusta la necesidad de inventar un nombre de variable ('i' en el ejemplo anterior) para cada uno)

Respuesta

15

seguirlo:

(0 /: l) { case (a, (b, c)) => b + a } 
4

Nota que, además de la respuesta de Walter, puede utilizar el subrayado _ en lugar de c en el partido patrón:

val i = (0 /: l) { case (a, (b, _)) => b + a } 

Actúa como un todo vale marcador de posición en el patrón Tuple2 y (en mi mente) lo hace más claro que en realidad no usa el valor en su cálculo.

Además, en 2,8 que sería capaz de hacer:

val i = l.map(_._1).sum