2011-04-21 34 views

Trả lời

6

Bạn thấy ở đây phiên bản giới hạn mẫu khớp khi khởi tạo biến. Lưu ý rằng các công trình này không chỉ dành cho các bộ:

val a :: b = List(1,2,3) 
println(a) //1 
println(b) //List(2, 3) 

Tính năng này dường như được vay trực tiếp từ Haskell, nơi bạn có thể sử dụng các mẫu để khởi tạo cũng như:

let (a,b) = getTuple 
in a*b 

Như Haskell không có dữ liệu có thể thay đổi, không có cách nào để gán cái gì đó.

Trong Scala bạn có thể làm điều gì đó như thế này, nhưng tôi đoán điều này được coi là quá khó hiểu hoặc có thể quá khó thực hiện. Bạn luôn có thể sử dụng biểu thức match như bình thường và thường bạn chỉ cần case, ví dụ: List((1,2),(3,4)).map{ case (a,b) => a*b }.

2

Nghi ngờ của tôi sẽ là không có "var" hoặc "val" ở bên trái của bộ tên biến, trình biên dịch coi bộ dữ liệu là bộ tuple. Đó là, bạn đang thực sự cố gắng gán một giá trị cho một thể hiện của Tuple3 chứ không phải với ba biến, và điều đó không có ý nghĩa với trình biên dịch.

Ngẫu nhiên, việc sử dụng hàm và các kiểu dữ liệu khác nhau trong ví dụ của bạn không có liên quan. Dưới đây là ví dụ đơn giản:

scala> var (i, j, k) = (1, 2, 3) 
i: Int = 1 
j: Int = 2 
k: Int = 3 

scala> (i, j, k) = (4, 5, 6) 
<console>:1: error: ';' expected but '=' found. 
     (i, j, k) = (4, 5, 6) 
       ^
Các vấn đề liên quan