我正在学习Scala(主要来自Java的背景)。我正试图把我的头围绕以下代码:
object Main {
def main(args : Array[String]) {
for (file <- filesEnding(".txt"))
println(file.getName)
}
private val filesHere = (new java.io.File(".")).listFiles
def filesMatching(matcher: String => Boolean) =
for (file <- filesHere; if matcher(file.getName))
yield file
def filesEnding(query: String) = filesMatching(_.endsWith(query))
/* Other matcher functions */
}
特别是我很困惑Scala在每个匹配器函数中获得_
的值。我可以看到filesEnding
的参数是.txt
。这个论点被分配给query
。然后,filesEnding
用与String => Boolean
函数一致的参数调用filesMatching
。最后,我可以看到file.getName
最终取代了_
占位符。
我不明白的是Scala怎么知道把file.getName
放在_
的位置。我在脑海中跟踪这些代码时遇到了麻烦,eclipse调试器在这种情况下没有多大帮助。有人能告诉我这段代码是怎么回事吗?
_
只是创建匿名函数的简写:
_.endsWith(query)
与匿名函数
相同fileName => fileName.endsWith(query)
这个函数然后作为参数matcher
传递给filesMatching
。在该函数中,可以看到调用
matcher(file.getName)
调用匿名函数,file.getName
作为_
参数(我在显式示例中称为fileName
)。
如果你写_.someMethod(someArguments)
,它将被降糖为x => x.someMethod(someArguments)
,那么filesMatching(_.endsWith(query))
将被降糖为filesMatching(x => x.endsWith(query))
。
所以filesMatching
被调用,matcher
是函数x => x.endsWith(query)
,即一个函数接受一个参数x
,并在该参数上调用x.endsWith(query)
。