2011-09-23 2 views
9

왜 여기에 괄호가 필요합니까? 내가 알아야 할 선행 규칙이 있습니까?스칼라 : 괄호없이 표현식에 "foo match {bar}"를 사용할 수 있습니까?

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 

감사합니다.

+0

lvalue 란 무엇입니까? :-) – soc

+0

soc : 제목을 좀 더 이해하기 쉬운 것으로 변경했습니다. –

답변

3

일치 식은 간단한 식으로 간주되지 않습니다. 다음은 비슷한 예입니다.

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 

분명히 원하는 곳에 복잡한 표현식을 쓸 수 없습니다. 나는 왜 그런지 모르며 주제에 대한 지식이있는 사람이 당신에게 더 나은 대답을 줄 것을 희망합니다.

8

Agilesteel에 따르면 일치 항목은 간단한 표현식으로 간주되지 않으며 if 문도 아니므로 표현식을 괄호로 묶어야합니다. The Scala Language Specification, 6 개의 표현식, p73에서 일치 항목은 if 인 것처럼 Expr입니다. + 연산자의 양쪽에서 SimpleExpr 만 허용됩니다.

Expr을 SimpleExpr로 변환하려면()로 둘러싸 야합니다. 완성도 복사

:

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

스칼라 사양의 일부 검사 후, 나는 그에게 기회를 줄 수 있다고 생각합니다. 내가 틀렸다면 나를 바로 잡으십시오.

먼저, if 또는 matchExpr - 표현식으로 정의됩니다.

especification (섹션 3.2.8)의 상태 그러나 당신은 (두 식 사이의 연산자를 사용하여 정의) 중위 표현

을 만들려고한다 :

과학 X 사업자의 모든 유형 우선 순위가 같다. 괄호 로도 또한 상태

그룹화에 사용되는 것을 : 인터넷 X 운영 T0 T1이 OP1, OP2의 연속적인 형태의 서열

. . .opn tn, 모든 연산자 op1,. . . , opn은 동일한 연관성을 가져야합니다. 모두 왼쪽 연관 형인 경우 시퀀스는 (... (t0 op1 t1) op2 ....) opn tn으로 해석됩니다.

제 생각에는 Scala가 무엇을 먼저 줄여야할지 모르는 것입니다 : 일치 또는 '+'메소드 호출.

는 만약 내가 잘못 제발 올바른이 answer

에서 살펴 보자.

+1

감사합니다. 이것은 나에게 문법의 감독처럼 보인다. 그리고''(Exprt) '''(section 6.9 : Tuple)에있는 스펙의 부분은 괄호 사이에 오직 하나의 표현식이있는 경우를 말하지 않습니다. –

+0

환영합니다.Expr은 Expr { ','Expr}로 정의되며 이는 표현의 반복을 나타냅니다 (http : //www.scala-lang.org/docu/files/ScalaReference.pdf의 Scala Syntax Summary (162 페이지) //en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_Form). 따라서 하나의 표현식이나 반복 된 표현식을 나타낼 수 있습니다. – JaimeJorge

+0

고마워요.하지만 6.9에서는 클래스 인스턴스 생성 scala.Tuplen (e 1, ..., en)에 대한 별칭 인 튜플 표현식 (e 1, ..., en)은 n ≥ 2 빈 튜플()은 scala.Unit.'의 고유 값입니다. n = 1의 경우는 언급되지 않았다. –

관련 문제