有时,当您刚学习一种新语言时,仅由于搜索关键字非常琐碎(导致太多不相关的搜索结果),或者我不知道要使用什么关键字,很难找到非常基本的答案。
我正在看Jetbrains的第一部关于IntelliJ和Scala(https://www.youtube.com/watch?v=UJe4wPUtcUQ#t=235)功能的电影。在此框架中,您会看到以下代码:
test("Email with valid address") {
val email = Email("[email protected]")
assert(email.address != null)
}
这似乎很奇怪(来自Java)并查看Scalatest.FunSuite的API文档,我发现Funsuite是一个功能测试套件,但是我无法在
test
(http://doc.scalatest.org/2.2.1/index.html#org.scalatest.FunSuite)的文档中找到函数FunSuite
。我的猜测是函数
test
以某种方式要求您在其后定义一个匿名函数,但这意味着什么? test
返回什么?如果不在test
类中,我在哪里可以找到FunSuite
的API文档? 最佳答案
您应该阅读的领域是Scala支持将函数作为参数传递给其他函数。您正在查看的是函数的Scala语法,该语法返回一个函数,该函数又将另一个函数作为参数(真是令人满口!)。一些代码可以使它更清晰,原始的Scala代码是:
test("Email with valid address") {
val email = Email("[email protected]")
assert(email.address != null)
}
这与
test("Email with valid address")( {
val email = Email("[email protected]")
assert(email.address != null)
} )
请注意额外的花括号,这意味着代码块已作为另一个函数的参数被传递。
为了使这一点更加具体,在Java中我们可能会这样看:
test("Email with valid address").apply( new Function0() {
public void invoke() {
val email = Email("[email protected]")
assert(email.address != null)
}
}
或在Java 8中
test("Email with valid address").apply(
() -> {
val email = Email("[email protected]")
assert(email.address != null)
}
}
请注意,Scala变体非常简洁,旨在支持语言本身的扩展。因此,库可以创建类似于语言级别语法的API。
有关更多信息,以下两个博客文章将非常有用:defining custom control structures和by name parameter to function