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

tôi có thể làmdanh sách lần của bản ghi trong scala với destructuring

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

Nhưng tôi muốn để có thể đặt tên cho các phần tử của tuple. Một cái gì đó như:

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

Tôi biết tôi có thể làm:

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

Nhưng có một cách để làm cho đoạn code ngắn gọn hơn (mã thật của tôi bao gồm nhiều nếp gấp như vậy và tôi không thích cần phải phát minh ra một tên biến ('i' trong ví dụ trên) cho mỗi)

Trả lời

15

này cung cấp cho một thử:

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

Note rằng, ngoài câu trả lời của Walter, bạn có thể sử dụng gạch _ thay vì c trong mô hình phù hợp:

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

Nó hoạt động như một điều gì đi giữ chỗ trong mẫu Tuple2 và (để tâm trí của tôi) làm cho nó rõ ràng hơn là bạn không thực sự sử dụng giá trị trong phép tính của mình.

Ngoài ra, trong 2,8 bạn sẽ có thể làm:

val i = l.map(_._1).sum 
Các vấn đề liên quan