2017-12-23 16 views
2

Actionに(括弧ではなく)コードのブロックを渡す方法はありますか?私はこの構文を理解することができません。私はActionFunction1であると仮定し()Playのアクションメソッドの構文を理解できません

val echo = Action { request => 
    Ok("Got request [" + request + "]") 
} 

を使用しないでください。スカラ座からの次の例では、()を使用するため、どのようにAction作品{}

object Main extends App { 
    val succ = (x: Int) => x + 1 //create Function 1 
    val anonfun1 = new Function1[Int, Int] { //create another Function1 
    def apply(x: Int): Int = x + 1 
    } 
    assert(succ(0) == anonfun1(0)) //notice use of() 
} 

と私は後で()代わりの{}を用いて試験し、コードがまだ動作します。したがって、可読性を向上させるだけの{}の使用ですか? Scalaの括弧と中括弧で

val echo = Action (request => 
    Ok("Got request [" + request + "]") 
) 
+1

[Playフレームワークのコードに関する混乱]の可能な複製(https:// stackove rflow.com/questions/27664675/confusion-about-play-frameworks-code) –

+0

最初に[documentation](https://www.playframework.com/documentation/latest/ScalaActions) – cchantep

答えて

1

さまざまなシナリオでそれらの1 function`s引数リストにラッパー()いる交換可能です。

def multiply(num: Int)(by: Int): Int = num * by 

multiply(5)(2) 
multiply{5}{2} 

中括弧構文も内部に書き込まれる複数のライン表現することができます:あなたはScalaの詳細を読む必要があるよう

multiply{ 
    val num = 5 
    num 
}{ 
    val by = 2 
    by 
} 
+1

を読んでください。かっこと中括弧は 'どのシナリオでもScalaでは互換性がありません。 Scalaは同じことを書くために複数の方法を提供していたからです。 –

4

が見えます。

は最初の基礎、ここで

scala> val a = 5 
// a: Int = 5 

で始めることができます、RHSはちょうど5あるとexpression eiteralまたはliteral expressionと呼ばれています。

は同様に、Scalaはまた、RHSは { 5 }で、 block expressionと呼ばれ、この blockがここ 5に評価され、ここで、

scala> val a = { 5 } 
// a: Int = 5 

することができます。

今、私たちのユースケース今

scala> object A { 
    | def apply(i: Int) = i + 5 
    | } 
// defined module A 

に移りましょう、Scalaは、

val x1 = A(10) 
// x1: Int = 15 

// Or 
val x2 = A { 10 } 
// x2: Int = 15 

なぜ私たちは2つの方法でAを使用することができますか? Scalaの言語仕様を見てください - 私たちは、その後、我々はどのExpr(偶数倍)を提供することができます関数を適用する()を使用している場合、だから、あなたは以下の文法が表示され、ここで

SimpleExpr ::= SimpleExpr1 ArgumentExprs 
ArgumentExprs ::= ‘(’ [Exprs] ‘)’ 
       | ‘(’ [Exprs ‘,’] PostfixExpr ‘:’ ‘_’ ‘*’ ‘)’ 
       | [nl] BlockExpr 
Exprs   ::= Expr {‘,’ Expr} 

Functional Application

をそうでない場合は、我々は今、BlockExpr

を提供する必要があり、(説明のために簡略化)あなたの例の話をすることができます

val echo = Action(request => Ok("")) 

// VS 

val echo = Action { request => Ok("") } 

パーサーによってどのように解析されるかには違いがあります。

以下の規則と最初の進行の解析、二つ以下の規則を使用

SimpleExpr  ::= SimpleExpr1 ArgumentExprs 
ArgumentExprs  ::= ‘(’ [Exprs] ‘)’ 
Exprs    ::= Expr {‘,’ Expr} 
Expr    ::= (Bindings | [‘implicit’] id | ‘_’) ‘=>’ Expr 

SimpleExpr  ::= SimpleExpr1 ArgumentExprs 
ArgumentExprs  ::= [nl] BlockExpr 
BlockExpr   ::= ‘{’ Block ‘}’ 
Block    ::= BlockStat {semi BlockStat} [ResultExpr] 
ResultExpr  ::= (Bindings | ([‘implicit’] id | ‘_’) ‘:’ CompoundType) ‘=>’ Block 
Block    ::= BlockStat {semi BlockStat} [ResultExpr] 
BlockStat   ::= Expr1 

フル構文解析ツリー表現、

enter image description here

関連する問題