2012-04-06 29 views
7
val A = 3 
val (A) = (3) 

Cả hai đều chính xác. Nhưng:`val (A) = (3)` là chính xác, nhưng `val (A, B) = (2,3)` không thể được biên dịch, tại sao?

val (A,B) = (2,3) 

không thể được biên dịch:

scala> val (A,B) = (2,3) 
<console>:7: error: not found: value A 
     val (A,B) = (2,3) 
      ^
<console>:7: error: not found: value B 
     val (A,B) = (2,3) 
      ^

Tại sao?

+4

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'. –

+0

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) –

+0

@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

Trả lời

13

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>) 
+0

'val A = 1' không khớp với mẫu? Hãy thử 'val 1 = 2' – Freewind

+0

Tôi có nghĩa là' 'val (A) = (3)' 'không phù hợp với mô hình như' 'val (A, B) = (2, 3)' ', nó được biên dịch thành cùng một bytecode như '' val A = 3''. –

Các vấn đề liên quan