Scala _占位符(这段代码是如何工作的?)



我正在学习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)

相关内容

  • 没有找到相关文章

最新更新