2011-09-23 32 views
9

Tại sao các dấu ngoặc đơn cần ở đây? Có một số quy tắc ưu tiên mà tôi nên biết không?Scala: Bạn có thể sử dụng "foo match {bar}" trong một biểu thức không có dấu ngoặc đơn không?

scala> 'x' match { case _ => 1 } + 1 
<console>:1: error: ';' expected but identifier found. 
     'x' match { case _ => 1 } + 1 
           ^

scala> ('x' match { case _ => 1 }) + 1 
res2: Int = 2 

Cảm ơn!

+0

Lvalue là gì? :-) – soc

+0

soc: Tôi đã thay đổi tiêu đề thành cái gì đó dễ hiểu hơn. –

Trả lời

3

Biểu thức đối sánh không được coi là biểu thức đơn giản. Dưới đây là ví dụ tương tự:

scala> val foo = "bar" + if(3 < 5) 3 else 5 // does not compile 
scala> val foo = "bar" + (if(3 < 5) 3 else 5) // does compile 

Dường như bạn không thể viết biểu thức phức tạp ở bất cứ đâu bạn muốn. Tôi không biết tại sao và hy vọng rằng ai đó có nhiều kiến ​​thức về chủ đề này sẽ cho bạn câu trả lời tốt hơn.

8

Như Agilesteel nói, một trận đấu không được coi là một biểu thức đơn giản, cũng không phải là câu lệnh if, vì vậy bạn cần bao quanh biểu thức bằng dấu ngoặc đơn. Từ The Scala Language Specification, 6 Biểu thức, p73, kết quả phù hợp là Expr, như là một if. Chỉ SimpleExpr được chấp nhận ở hai bên toán tử +.

Để chuyển đổi một Expr thành SimpleExpr, bạn phải bao quanh nó bằng().

sao chép cho đầy đủ:

Expr ::= (Bindings | id | ‘_’) ‘=>’ Expr 
    | Expr1 
Expr1 ::= ‘if’ ‘(’ Expr ‘)’ {nl} Expr [[semi] else Expr] 
    | ‘while’ ‘(’ Expr ‘)’ {nl} Expr 
    | ‘try’ ‘{’ Block ‘}’ [‘catch’ ‘{’ CaseClauses ‘}’] [‘finally’ Expr] 
    | ‘do’ Expr [semi] ‘while’ ‘(’ Expr ’)’ 
    | ‘for’ (‘(’ Enumerators ‘)’ | ‘{’ Enumerators ‘}’) {nl} [‘yield’] Expr 
    | ‘throw’ Expr 
    | ‘return’ [Expr] 
    | [SimpleExpr ‘.’] id ‘=’ Expr 
    | SimpleExpr1 ArgumentExprs ‘=’ Expr 
    | PostfixExpr 
    | PostfixExpr Ascription 
    | PostfixExpr ‘match’ ‘{’ CaseClauses ‘}’ 
PostfixExpr ::= InfixExpr [id [nl]] 
InfixExpr ::= PrefixExpr 
    | InfixExpr id [nl] InfixExpr 
PrefixExpr ::= [‘-’ | ‘+’ | ‘~’ | ‘!’] SimpleExpr 
SimpleExpr ::= ‘new’ (ClassTemplate | TemplateBody) 
    | BlockExpr 
    | SimpleExpr1 [‘_’] 
SimpleExpr1 ::= Literal 
    | Path 
    | ‘_’ 
    | ‘(’ [Exprs] ‘)’ 
    | SimpleExpr ‘.’ id s 
    | SimpleExpr TypeArgs 
    | SimpleExpr1 ArgumentExprs 
    | XmlExpr 
Exprs ::= Expr {‘,’ Expr} 
BlockExpr ::= ‘{’ CaseClauses ‘}’ 
    | ‘{’ Block ‘}’ 
Block ::= {BlockStat semi} [ResultExpr] 
ResultExpr ::= Expr1 
    | (Bindings | ([‘implicit’] id | ‘_’) ‘:’ CompoundType) ‘=>’ Block 
Ascription ::= ‘:’ InfixType 
    | ‘:’ Annotation {Annotation} 
    | ‘:’ ‘_’ ‘*’ 
5

Sau khi một số kiểm tra trong đặc tả Scala, tôi nghĩ rằng tôi có thể cung cấp cho nó một shot. Nếu tôi sai, hãy sửa tôi.

trước tiên, một if hoặc match được định nghĩa là Expr - biểu thức.

Bạn đang cố gắng để tạo ra một biểu thức trung tố (được xác định bằng cách sử dụng các nhà điều hành giữa hai biểu thức)

Tuy nhiên especification (phần 3.2.8) cho rằng:

Tất cả các loại trong các nhà khai thác x fi có cùng quyền ưu tiên; ngoặc phải được sử dụng cho nhóm

Nó cũng cũng nói rằng:

Trong một chuỗi các loại liên tiếp trong hoạt động fi x t0 t1 op1 op2. . .opn tn, tất cả toán tử op1,. . . , opn phải có cùng một kết hợp . Nếu tất cả chúng đều liên kết trái, trình tự là được hiểu là (... (T0 op1 t1) op2...) Opn tn.

Vì vậy, nhận của tôi là Scala không biết phải giảm cái gì trước: khớp hoặc phương thức gọi '+'.

Hãy xem này answer

Xin vui lòng sửa tôi nếu tôi sai.

+1

Cảm ơn! Điều này có vẻ như một sự giám sát trong cú pháp đối với tôi. Và một phần của thông số về ‘‘ (’[Exprs]‘) ’' (phần 6.9: Tuple) không nói về trường hợp chỉ có một biểu thức giữa các dấu ngoặc đơn, nó có được định nghĩa ở nơi khác không? –

+0

Chào mừng bạn.Trong Tóm tắt Cú pháp Scala (trang 162) của http://www.scala-lang.org/docu/files/ScalaReference.pdf Exprs được định nghĩa là Expr {',' Expr} đại diện cho sự lặp lại của biểu thức (http: //en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_Form). Vì vậy, có thể đại diện cho một biểu thức hoặc biểu thức lặp đi lặp lại. – JaimeJorge

+0

Cảm ơn nhưng tôi có nghĩa là 6.9 chỉ nói 'Một biểu thức tuple (e 1,..., En) là một bí danh cho việc tạo cá thể lớp scala.Tuplen (e 1,..., En), trong đó n ≥ 2 Tuple trống() là giá trị duy nhất của loại scala.Unit.'. Trường hợp n = 1 không được đề cập. –

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