Trong đoạn mã thứ hai, đoạn mã sử dụng mẫu phù hợp để thực hiện đánh giá.
Nó được phiên dịch sang các mã sau:
val Tuple(A, B) = Tuple2(2,3)
Khi Scala đang làm mô hình kết hợp, biến bắt đầu với một chữ hoa trong mô hình được đánh giá là một giá trị không đổi (hoặc Object singleton), do đó val (a, b) = (2, 3)
công trình nhưng không phải val (A, B) = (2, 3)
.
BTW, đoạn mã đầu tiên của bạn không sử dụng đối sánh mẫu, nó chỉ là một phép gán biến thông thường.
Nếu bạn sử dụng Tuple1
một cách rõ ràng, nó sẽ có lỗi tương tự.
scala> val Tuple1(Z) = Tuple1(3)
<console>:7: error: not found: value Z
val Tuple1(Z) = Tuple1(3)
Dưới đây là một số ví dụ thú vị:
scala> val A = 10
A: Int = 10
scala> val B = 20
B: Int = 20
scala> val (A, x) = (10, 20)
x: Int = 20
scala> val (A, x) = (10, 30)
x: Int = 30
scala> val (A, x) = (20, 20)
scala.MatchError: (20,20) (of class scala.Tuple2$mcII$sp)
at .<init>(<console>:9)
at .<clinit>(<console>)
Nguồn
2012-04-06 09:32:07
Nó có cái gì để làm với 'A' và' b' được xác định là "định danh ổn định" Tôi nghĩ. Hãy thử: 'val (a, b) = (1, 2)', là hợp lệ. Hãy thử điều này để xem: 'val (String, Int) = (1, 2)', trong đó có các thông điệp thú vị :) Tôi không chắc nơi/nếu điều này được định nghĩa, nhưng tôi nghĩ * nó nằm dưới phần 'match' và" pattern matching "trong SLS. Đặc biệt, nơi nó nói về cách kết hợp hoạt động khi nó gọi là 'unapply'. –
bản sao có thể có của [Nhiều phép gán thông qua khớp mẫu với Array không hoạt động với các chữ cái hoa] (http://stackoverflow.com/questions/8204219/multiple-assignment-via-pattern-matching-with-array-is-not- work-with-uppercas) –
@pst Chúng ta có thể làm tương tự với 'var' không? Trong Java, chúng ta có thể thực hiện 'int a, b, c;'. Trong Scala, tôi muốn 'var (a, b, c): Int', không hoạt động. – Jus12