scala> val l = List((1,2), (2,3))
l: List[(Int, Int)] = List((1,2), (2,3))
我能做到
scala> (0 /: l) {(a, i) => i._1 + a}
res20: Int = 3
但我希望能够命名元组的元素。类似的东西:
scala> (0 /: l) {(a, (b,c)) => b + a}
<console>:1: error: not a legal formal parameter
(0 /: l) {(a, (b,c)) => b + a}
^
我知道我能做到:
scala> (0 /: l) {(a, i) => val (b, c) = i; b + a}
res0: Int = 3
但有没有办法让代码更简洁(我的真实代码涉及几个这样的折叠,我不喜欢需要为每个代码发明一个变量名称(在上面的例子中为'i')
答案 0 :(得分:18)
尝试一下:
(0 /: l) { case (a, (b, c)) => b + a }
答案 1 :(得分:4)
请注意,除了Walter的回答,您还可以在模式匹配中使用下划线_
代替c
:
val i = (0 /: l) { case (a, (b, _)) => b + a }
它充当任何占位符的Tuple2
模式,并且(在我看来)更清楚地表明你实际上没有在计算中使用该值。
此外,在 2.8 中,你可以这样做:
val i = l.map(_._1).sum