2009-10-26 7 views
25

phân công tôi có thể gán một tuple như sau:tuple và kỳ quặc

var (min, max) = (1, 2) 

Nhưng tôi không thể rồi tái gán như sau

(min, max) = (1, 3) //compiler error: ';' expected but '=' found 

Thay vào đó tôi dường như phải làm:

min = 1 
max = 3 

Tại sao công việc sau lại hoạt động trong khi trước đây không hoạt động?

Trả lời

26

Vâng, bởi vì nó được xác định theo cách đó, tôi cho là vậy.

Điều này, nhiệm vụ tuple, là ví dụ về đối sánh mẫu. Mô hình kết hợp xảy ra ở ba nơi mà tôi nhớ lại của:

var PATTERN = ... // or val 

for (PATTERN <- ...) ... 

case PATTERN => ... 

Vì vậy, tất cả những trường hợp làm việc:

val l = List((1,'a'), (2,'b'), (3,'c')) 
var (n, c) = l(0) 
for ((n, c) <- l) println(n+": "+c) 
l(1) match { 
    case (n, c) => println(n+": "+c) 
} 

Bây giờ, lấy ví dụ cuối cùng, là sử dụng case. Lưu ý rằng nc trong ví dụ đó là không cùng một số nc được xác định trước đó một chút. So khớp mẫu sẽ chỉ định các giá trị cho new số nhận dạng nc, sẽ làm mờ định nghĩa trước đó cho việc thoát khỏi tuyên bố case. Điều tương tự cũng xảy ra trên ví dụ for, đã không thay đổi nc được xác định trước đó.

Bây giờ, những gì bạn muốn xảy ra là ghi đè giá trị trước đó, thay vì chỉ định giá trị mới cho số nhận dạng mới. Đó không phải là cách mô hình phù hợp với công trình, có nghĩa là làm cho nó xảy ra sẽ đòi hỏi một quy tắc hoàn toàn mới. Kể từ khi Scala nhẹ nhàng prods người đối với bất biến, tôi cho rằng nó không phải là không hợp lý họ đã không tạo ra một quy tắc mới chỉ để xử lý này.

+1

vé là https://issues.scala-lang.org/browse/SI-1324 ("nó sẽ cần một SIP") –