gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:15:02 24 4
gpt4 key购买 nike

如何将代码块(而不是括号)传递给 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 的更多信息。

让我们首先从基础开始

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

关于scala - 无法理解 Play 中 Action 方法的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47952415/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com