当您看到遵循此模式的代码时:
def index = Action { request =>
// ..
}
查看此代码时,您如何知道请求对象可在代码块中使用? (这有一个intellij快捷方式吗?)
有人可以创建一个模拟这种模式的缩影示例,这样我就可以理解它是如何工作的,如果你能用技术术语解释发生了什么?
答案 0 :(得分:3)
此处不感兴趣Action
特质。相反,因为index
方法的主体必须是值,而不是类型,所以您正在查看Action
对象。您可以了解有关对象here的更多信息。让我们首先通过删除语法糖来简化语法,即使程序行为相同但结构更简单。如果您尝试将对象称为方法,那么实际发生的是编译器为您插入.apply
:
def index = Action.apply((request) => {
// ..
})
这可能更熟悉;正在apply
对象上调用Action
方法,传递一个接受请求的lambda函数。很明显,lambda中的一个参数总是在lambda中可用。这就是他们的观点。
在这种情况下,lambda也称为回调。一个简单的例子阐明了这些特征如下:
object WithAnswer {
def apply(f: Int => Unit): Unit =
f(42)
}
def printAnswer() = WithAnswer { answer =>
println(answer)
}
答案 1 :(得分:1)
这称为Loan pattern
withWriter
为用户创建一个编写器,然后在使用后确保资源(编写器)正确密切。
用户所要做的只是使用writer
并将一些内容写入文件
def withWriter(file: File)(f: Writer => Unit): Unit = {
val writer = new PrintWriter(file)
try {
f(writer)
} finally {
writer close
}
}
用法:
withWriter(new File("some_fix.txt") { writer =>
writer println("write something")
}