我正在读一本关于scala编程的书(Scala编程),我对yield语法有疑问。
根据这本书,yield的语法可以表示为: for clauses yield body
但是当我尝试运行下面的脚本时,编译器会抱怨getName
的参数太多def scalaFiles =
for (
file <- filesHere
if file.isFile
if file.getName.endsWith(".scala")
) yield file.getName {
// isn't this supposed to be the body part?
}
所以,我的问题是yield语法的“body”部分是什么,如何使用它?
答案 0 :(得分:16)
很快,任何表达式(甚至返回Unit),但是你必须将该表达式括在括号中或者只是将它们放下(仅适用于单个语句表达式):
def scalaFiles =
for (
file <- filesHere
if file.isFile
if file.getName.endsWith(".scala")
) yield {
// here is expression
}
上面的代码可以工作(但没有任何意义):
scalaFiles: Array[Unit]
下一个选项是:
for(...) yield file.getName
作为提示,你可以像这样重写你的理解:
def scalaFiles =
for (
file <- filesHere;
if file.isFile;
name = file.getName;
if name.endsWith(".scala")
) yield {
name
}
答案 1 :(得分:-1)
您可以尝试使用Zach Cox的lovely post
def files(rootDir: File)(process: File => Unit) {
for (dir <- rootDir.listFiles; if dir.isDirectory) {
for (file <- dir.listFiles; if file.isFile) {
process(file)
}
}
}