什么Scala概念用于使Scalatra DSL工作?

ato*_*tok 5 scala scalatra

我试图通过尝试使用Scalatra来进入Scala.我不久前在课程上完成了Martin Odersky的课程,但我仍然很难理解这是如何工作的:

package com.example.app
import org.scalatra._

class HelloWorldApp extends ScalatraFilter {
  get("/") {
    <h1>Hello, {params("name")}</h1>
  }
}
Run Code Online (Sandbox Code Playgroud)

此示例取自Scalatra主页:http://www.scalatra.org/

如何执行此声明:

get("/") {
    Hello, {params("name")}
}

{}参数的get()方法吗?你能解释一下Scala语言的哪些特性在使用吗?Scalatra源代码的指针将是完美的定义,这将是完美的.

god*_*lka 8

getCoreDsl中定义如下

def get(transformers: RouteTransformer*)(block: => Any): Route
Run Code Online (Sandbox Code Playgroud)

因此,get需要两个参数,一系列路由变换器(字符串被隐式转换为路由变换器)和一个输出类型的无参数方法Any.这里有趣的部分是第二个参数.

首先要理解的是,作为函数参数的无参数方法是在Scala中专门处理的,即按名称调用,参见自动类型相关的闭包构造以及Scala语言参考,第6.6节,p.78,这是p.PDF的86:

具有无参数方法类型的形式参数的情况=> T 被特别处理.在这种情况下,e在应用程序之前不会评估相应的实际参数表达式.相反,在重写规则的右侧使用形式参数需要重新评估e.换句话说,=>参数的评估顺序是按名称调用,而正常参数的评估顺序是按值调用.

第二个方面是在函数应用程序中,参数可以包含在()("常规"参数)或{}(更确切地说,在这种情况下,它们必须是块表达式,它们甚至可以在新行上开始),请参阅Scala语言关于功能应用的参考,第6.6节.77,这是p.85的PDF.

另请注意,这两个功能是如何使Scala成为定义DSL(或类似关键字的新功能)的有吸引力的语言的重要组成部分.

以下问题的部分内容可能也很有趣Scala中每个列表的多个参数列表和多个参数之间的区别什么?