我试图通过尝试使用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中每个列表的多个参数列表和多个参数之间的区别是什么?
| 归档时间: |
|
| 查看次数: |
186 次 |
| 最近记录: |