2013-05-04 42 views
7

Tại sao không thể kết hợp các cấu trúc phù hợp với mẫu? Ví dụ, sau đây là hợp pháp, nếu vô nghĩa,Giá trị "trả lại" đối sánh mẫu

val a = ADT(5) 

val b = a match { 
    case ADT(a) if a > 4 => ADT(a * 3) 
    case ADT(a) => ADT(a + 1) 
} 
b match { 
    case ADT(a) if a > 13 => doSomething(a) 
    case _ => {} 
} 

nhưng đây không phải là:

a match { 
    case ADT(a) if a > 4 => ADT(a * 3) 
    case ADT(a) => ADT(a + 1) 
} match { 
    case ADT(a) if a > 13 => doSomething(a) 
    case _ => {} 
} 

tôi nghi ngờ đó là bởi vì tôi không nên làm việc đó ở nơi đầu tiên, nhưng về nguyên tắc Tôi không hiểu tại sao nó không hợp pháp.

+4

'(một trận đấu {..}) phù hợp {..}' sẽ làm việc. – user2246674

Trả lời

5

Có nó sẽ hoạt động, bởi vì (gần như) mọi thứ trong Scala là một biểu thức và mọi biểu thức có thể được sử dụng như một đối sánh mẫu.

Trong trường hợp này, đối sánh mẫu là biểu thức, do đó, nó có thể được sử dụng bởi một kết hợp mẫu "chuỗi" khác. Nhưng trình biên dịch không thích nó.

Giving trình biên dịch một chút gợi ý với ngoặc giúp:

case class ADT(value: Int) 

val a = ADT(5) 

(a match { 
    case ADT(a) if a > 4 => ADT(a * 3) 
    case ADT(a) => ADT(a + 1) 
}) match { 
    case ADT(a) if a > 13 => println(a) 
    case _ => {} 
} 
+0

Tôi tình cờ gặp các dấu ngoặc đơn, nhưng tôi không hiểu tại sao nó cần thiết ở đây nhưng không cần thiết với cái gì đó như 'val a = if (false) 6 else if (true) if (true) 5 else 3 else 2' –

+0

@CarlSummers trình biên dịch chỉ có thể phỏng đoán quá nhiều. Nó chỉ là thứ tự của các hoạt động. Khi nghi ngờ (bạn, hoặc trình biên dịch) có được rõ ràng. (Tôi mới đến Scala thực sự nhưng đây là một trong những điều tôi thích về nó.) – hangtwenty

3

Trực giác của bạn là chính xác; nó không phải là vô nghĩa — thông thường bạn sẽ có thể chuỗi các nhà khai thác infix theo cách như vậy, mà không cần dấu ngoặc đơn (như những người dùng khác đã đề xuất). Thật vậy, match được sử dụng để được thực hiện như một phương pháp — và làm việc như một toán tử kết hợp (mặc định liên kết bên trái) — do đó cú pháp thay thế của bạn sẽ hoạt động. Tuy nhiên, trong Scala 2.5, match đã được tạo thành một ngôn ngữ đặc biệt xây dựng thay vì một phương pháp. Thật không may, tôi không biết tại sao điều đó lại được thực hiện, nhưng đó là lý do: matchkhông phải là một nhà điều hành máy chủ, mặc dù có vẻ như vậy.

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