有时当你刚刚学习一门新语言时,很难找到一个非常基本的答案,因为搜索关键词要么非常微不足道(导致太多不相关的搜索结果),要么我不知道是什么关键词使用
我正在观看Jetbrains的第一部关于他们使用Scala的IntelliJ功能的电影(https://www.youtube.com/watch?v=UJe4wPUtcUQ#t=235)。在此框架中,您会看到以下代码:
test("Email with valid address") {
val email = Email("name@gmail.com")
assert(email.address != null)
}
这看起来很奇怪(来自Java)并查看Scalatest.FunSuite的API文档我看到Funsuite是一个功能测试套件,但我无法在文档中找到函数test
FunSuite
(http://doc.scalatest.org/2.2.1/index.html#org.scalatest.FunSuite)。
我的猜测是函数test
以某种方式要求你在它之后定义一个匿名函数,但这意味着什么? test
返回什么?如果不在课程test
中,我在哪里可以找到FunSuite
的API文档?
答案 0 :(得分:5)
您应该阅读的区域是Scala支持将函数作为参数传递给其他函数。你正在看的是一个函数的Scala语法,它返回一个函数,该函数又将另一个函数作为一个参数(多么令人满意!)。有些代码会更清晰,原始的Scala代码是:
test("Email with valid address") {
val email = Email("name@gmail.com")
assert(email.address != null)
}
与
相同test("Email with valid address")( {
val email = Email("name@gmail.com")
assert(email.address != null)
} )
注意额外的括号,暗示代码块作为另一个函数的参数过去。
为了让这个更具体一点,在Java中我们可能会看到这样:
test("Email with valid address").apply( new Function0() {
public void invoke() {
val email = Email("name@gmail.com")
assert(email.address != null)
}
}
或者在Java 8中
test("Email with valid address").apply(
() -> {
val email = Email("name@gmail.com")
assert(email.address != null)
}
}
请注意,Scala变体非常简洁,旨在支持语言本身的扩展。因此,库可以创建看起来像语言级语法的API。
有关详细信息,以下两篇博客文章将非常有用:defining custom control structures和by name parameter to function
答案 1 :(得分:2)
您在API文档中找不到test
方法时遇到困难,因为默认情况下,非公开成员未显示,test
标记为protected
。
如果您点击“全部显示”按钮,test
方法将显示在成员列表中。
扩展其文档还会显示特征where it is defined(定义类 FunSuiteLike
)。