scala - yield语法

时间:2012-03-21 00:23:03

标签: scala yield

我正在读一本关于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”部分是什么,如何使用它?

2 个答案:

答案 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) } } }