2011-09-23 3 views
9

ここでかっこが必要なのはなぜですか?私が知るべきいくつかの優先ルールがありますか?Scala:かっこなしの式で "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

Scalaの仕様では、いくつかの検査の後、私はそれに打撃を与えることができると思います。 私が間違っている場合は、私を修正してください。

最初に、ifまたはmatchは、Expr - 式として定義されます。

especification(セクション3.2.8)は述べしかし、あなたは(2式の間演算子の使用によって定義される)中置式

を作成しようとしていること:

Fi回線X演算子のすべてのタイプ同じ優先順位を持つ。括弧は にそれはまた、述べ

をグループ化するために使用されていること:のfi XオペレーションOP1 T0 T1はOP2における連続タイプの配列で

。 。 .opn tn、すべての演算子op1、。 。 。 、opnは同じ の結合性を持っていなければなりません。それらがすべて左結合である場合、シーケンスは (...(t0 op1 t1)op2 ...。)opn tnと解釈されます。

私はScalaが何を最初に減らすべきかを知っていません。つまり、マッチまたはメソッドの呼び出しです。

は私が間違っているなら、私を修正してください。このanswer

を見てみましょう。

+1

ありがとう!これは私の構文の見落としのようです。そして、 ''(Exprs '') ''(セクション6.9:Tuple)の仕様の部分は、括弧の間に1つの式しかない場合については言及していません。 –

+0

ようこそ。ExprはExpr {'、' Expr}で定義されています。これは式の繰り返しを表します(http://www.scala-lang.org/docu/files/ScalaReference.pdf) //en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_Form)。つまり、1つの式または繰り返し式を表すことができます。 – JaimeJorge

+0

ありがとうございましたが、6.9では、 'タプル式(e 1、...、en)はクラスインスタンスの作成のエイリアスです。 scala.Tuplen(e 1、...、en)、n≧2空のタプル()は、 型scala.Unit.'の一意の値です。 n = 1の場合は言及されていない。 –

関連する問題