在定义Scala匿名函数时可以使用块吗?

时间:2009-12-10 20:26:22

标签: scala anonymous-function

我有这个方法:

def myMethod(value:File,x: (a:File) => Unit) = {
   // Some processing here
   // More processing
   x(value)
}

我知道我可以称之为:

myMethod(new File("c:/"),(x:File) => println(x))

有没有办法可以用支架调用它?类似的东西:

myMethod(new File("c:/"),{ (x:File) =>
     if(x.toString.endsWith(".txt")) {
         println x
     }
})

或者我必须用另一种方法写出来并将其传递给myMethod

2 个答案:

答案 0 :(得分:7)

函数的正文部分可以是括在括号中的块:

myMethod(new File("c:/"), x => { 
  if (x.toString.endsWith(".txt")) {
    println(x) 
  }
})

另一种方法是将myMethod定义为curried函数:

def myMethod(value: File)(x: File => Unit) = x(value)

现在您可以编写如下代码:

myMethod(new File("c:/")) { x => 
  if (x.toString.endsWith(".txt")) {
    println(x) 
  }
}

答案 1 :(得分:2)

如果您更正xprintln x周围缺少括号,那么您提供的示例实际上有效。只需加上括号,您的代码即可运行。

所以,现在,您可能想知道什么时候需要括号,什么时候不需要。幸运的是,其他人已经问过that very question