带参数的匿名函数

时间:2016-09-28 18:07:35

标签: scala

当您看到遵循此模式的代码时:

def index = Action { request =>
  // ..
}

行动特质:https://github.com/playframework/playframework/blob/master/framework/src/play/src/main/scala/play/api/mvc/Action.scala#L65

查看此代码时,您如何知道请求对象可在代码块中使用? (这有一个intellij快捷方式吗?)

有人可以创建一个模拟这种模式的缩影示例,这样我就可以理解它是如何工作的,如果你能用技术术语解释发生了什么?

2 个答案:

答案 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")
 }