が見えます。
は最初の基礎、ここで
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
フル構文解析ツリー表現、
[Playフレームワークのコードに関する混乱]の可能な複製(https:// stackove rflow.com/questions/27664675/confusion-about-play-frameworks-code) –
最初に[documentation](https://www.playframework.com/documentation/latest/ScalaActions) – cchantep