无法理解Play中Action方法的语法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法理解Play中Action方法的语法相关的知识,希望对你有一定的参考价值。

我怎么能把一段代码(而不是括号)传递给Action?我无法理解这种语法。我不应该使用()

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

我想ActionFunction1。 Scala的以下示例使用(),所以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 ()
}

我后来测试使用()而不是{},代码仍然有效。使用{}只是为了提高可读性吗?

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

在Scala中,括号和花括号在各种场景中是可互换的,其中一个是函数参数列表中的包装器()

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

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

花括号语法还允许在内部写入多行表达式:

multiply{
  val num = 5
  num
}{
  val by = 2
  by
}
另一答案

看起来您需要阅读有关Scala的更多信息。

让我们首先从基础开始,

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

在这里,RHS只是5,被称为expression eiteralliteral expression

同样,Scala也允许,

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

在这里,RHS是{ 5 },被称为block expression,这里的block评估为5

现在,让我们转到我们的用例

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

现在,Scala允许我们以两种方式使用这个A

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

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

为什么?看看Scala语言规范 - Functional Application

在这里,您将看到以下语法,

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

所以,如果我们使用()来应用函数,那么我们可以提供任何Expr(甚至多个),否则我们必须提供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

以上是关于无法理解Play中Action方法的语法的主要内容,如果未能解决你的问题,请参考以下文章

从片段调用 Google Play 游戏服务

如何理解这段代码片段中的两对括号?

片段中的 startActivityForResult

Java Lambda

对Java方法方法重载的理解

将应用程序上传到 Google Play 商店时无法理解错误