我试图通过尝试使用Scalatra来进入Scala。一段时间前,我在Coursera上完成了Martin Odersky的类(class),但是我仍然很难理解它的工作原理:
package com.example.app
import org.scalatra._
class HelloWorldApp extends ScalatraFilter {
get("/") {
<h1>Hello, {params("name")}</h1>
}
}
此示例摘自Scalatra主页:http://www.scalatra.org/
该语句的执行方式:
得到(”/”) {
您好,{params(“name”)}
}
{}
是get()
方法的参数吗?您能在这里解释使用Scala语言的哪些功能吗? Scalatra源代码的指针将是完美的,定义它将是完美的。
最佳答案
CoreDsl在Automatic Type-Dependent Closure Construction中定义如下
def get(transformers: RouteTransformer*)(block: => Any): Route
因此,
get
接受两个参数,一个路由转换器序列(将字符串隐式转换为路由转换器)和一个无参数方法,该方法输出get
类型的东西。这里有趣的部分是第二个参数。首先要了解的是,无参数方法作为函数参数是在Scala中专门处理的,即按名称调用,请参见Scala Language Reference, Section 6.6, p. 78, which is p. 86 of the PDF和block expressions:
第二个方面是,在函数应用程序中,参数可以包含在
Any
(“常规”参数)中或()
(更确切地说,在这种情况下,它们必须是Scala Language Reference on Function Application, Section 6.6 on p. 77, which is p. 85 of the PDF,甚至可以从新行开始),请参见What's the difference between multiple parameters lists and multiple parameters per list in Scala? 。还请注意,这两个功能是如何使Scala成为定义DSL(或类似关键字的新功能)的诱人语言的重要组成部分。
以下问题的某些部分可能也很有趣ojit_a
关于scala - 什么Scala概念被用于使Scalatra DSL正常工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24693323/