2013-08-09 44 views
5

Biểu thức đối sánh chuỗi không biên dịch.Tại sao biểu thức kết hợp chuỗi không biên dịch?

val x = Array("abc", "pqr") 

x match { 
    case Array("abc", _*) => Some("abc is first") 
    case Array("xyz", _*) => Some("xyz is first") 
    case _ => None 
} match { 
    case Some(x) => x 
    case _ => "Either empty or incorrect first entry" 
} 

Trong khi sau biên dịch tốt:

(x match { 
    case Array("abc", _*) => Some("abc is first") 
    case Array("xyz", _*) => Some("xyz is first") 
    case _ => None 
}) match { 
    case Some(x) => x 
    case _ => "Either empty or incorrect first entry" 
} 

Tại sao phiên bản sau này (trong đó biểu hiện trận đấu đầu tiên là trong ngoặc) biên dịch tốt trong khi một sớm không?

+3

Không có gì để nói ở đây, ngoại trừ 'match' không phải là một phương pháp, nhưng từ khóa và trình biên dịch hoạt động theo cách này. – senia

+0

@senia Luôn có điều gì đó để nói. Không phải lúc nào cũng ban đầu hay thú vị, tất nhiên. –

+0

@senia Nếu nó đã được trả lời, thì tôi sẽ không có câu trả lời. –

Trả lời

1

Nếu được phép, bạn không thể làm được:

scala> List(1,2,3) last match { case 3 => true } 
warning: there were 1 feature warning(s); re-run with -feature for details 
res6: Boolean = true 

Đó là, nếu nó là ký hiệu ghi vào, sau đó điều sang bên trái có thể không được postfix.

Không cho phép kết quả trùng khớp cho phép kiểm tra hậu tố.

Cái vẻ được phân tách một cách tự nhiên

(List(1,2,3) last) match { case 3 => true } 

có nghĩa là, nếu ký hiệu postfix là tự nhiên và không xấu xa.

Cảnh báo tính năng dành cho import language.postfixOps. Có lẽ với tính năng đó bị tắt, Defenders of the Good sẽ sẵn sàng giải trí import language.infixMatch.

xem xét cấu trúc đó là anh chị em cú pháp để match, mà không phải là infixable mà không cần dấu ngoặc:

scala> if (true) 1 else 2 match { case 1 => false } 
res4: AnyVal = 1 // not false 

scala> (if (true) 1 else 2) match { case 1 => false } 
res1: Boolean = false 

hoặc

scala> throw new IllegalStateException match { case e => "ok" } 
<console>:11: error: type mismatch; // not "ok", or rather, Nothing 
found : String("ok") 
required: Throwable 
       throw new IllegalStateException match { case e => "ok" } 
                   ^

scala> (throw new IllegalStateException) match { case e => "ok" } 
java.lang.IllegalStateException 
Các vấn đề liên quan