【发布时间】:2011-10-16 08:41:24
【问题描述】:
我正在学习 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 调试器在这种情况下并没有多大帮助。有人可以告诉我这段代码中发生了什么吗?
【问题讨论】:
-
关于这方面的一点提醒/建议:尽量避免使用下划线。它会为您省去一些麻烦!
-
@Andreas 我不明白为什么我应该尽量避免使用下划线。对于
filter、map等方法的简单参数,它非常有意义,不会造成麻烦并减少混乱。 -
是的,对于非常简单的语句,它可以正常工作,当然它是为工作而设计的;)但问题是(恕我直言)它所涉及的! scala 中的 13 种不同含义。
标签: scala functional-programming placeholder