2010-05-05 25 views
21

Tôi mới đến Scala, và chạy qua một trục trặc nhỏ khiến tôi khó chịu.Scala Tuple Deconstruction

Khởi tạo hai vars trong công trình song song lớn: var (x,y) = (1,2)

Tuy nhiên tôi không thể tìm thấy một cách để gán giá trị mới song song: (x,y) = (x+y,y-x) //invalid syntax

Tôi sẽ viết một cái gì đó như thế này: val xtmp = x+y; y = x-y; x = xtmp

Tôi nhận thấy viết mã chức năng là một cách để tránh điều này, nhưng có một số tình huống mà vars chỉ có ý nghĩa hơn.

Tôi có hai câu hỏi:

1) Có cách nào tốt hơn để làm việc này không? Tui bỏ lỡ điều gì vậy?

2) Lý do không cho phép gán đúng song song là gì?

+5

xem https://lampsvn.epfl.ch/trac/scala/ticket/1324 –

+0

@Seth Tisue, cảm ơn bạn, nhưng đây là một liên kết buồn - một WONTFIX :-( – greenoldman

Trả lời

21

Thật không may, bạn không thể thực hiện nhiều bài tập trong Scala. Nhưng bạn có thể sử dụng bộ dữ liệu, nếu chúng phù hợp với vấn đề của bạn:

scala> var xy = (1,2) 
xy: (Int, Int) = (1,2) 

scala> xy = (xy._1 + xy._2, xy._2 - xy._1) 
xy: (Int, Int) = (3,1) 

Bằng cách này, xy là một bộ có hai giá trị. Giá trị đầu tiên có thể được truy cập bằng cách sử dụng xy._1, giá trị thứ hai sử dụng xy._2.

0

Scala có 2 loại biến: vals và vars. Vals cũng tương tự như biến thức Java, vì vậy như xa như tôi hiểu những gì bạn đang yêu cầu, cách duy nhất để gán giá trị mới song song với Vals là bởi:

scala> val (x, y) = (1, 2); 

hoặc

scala> val s = (3, 4); 
s: (Int, Int) = (3,4) 

scala> s._1 
res1: Int = 3 

scala> s._2 
res2: Int = 4 
+1

Tôi hiểu tại sao bạn không thể gán một giá trị mới cho một val.Tôi đang nói về việc gán song song của vars.Trong mã từ câu hỏi của tôi, x và y là cả hai vars – dbyrne

+5

Anh ta hỏi bạn có thể làm 'val (x, y) = (1,2) 'và' var (x, y) = (1,2) 'thì tại sao bạn không thể làm' var x; var y; (x, y) = (1,2) '? –