我试图通过尝试使用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源代码的指针将是完美的定义,这将是完美的.
get
在CoreDsl中定义如下
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中每个列表的多个参数列表和多个参数之间的区别是什么?