3

我希望能够定义一个接受参数(例如文件对象)并返回一些东西(例如布尔值)的函数,然后将该函数(不是布尔值!)传递给另一个函数并接受函数调用发送函数。

我的背景是 Java,虽然我知道如何发送一个不接受任何参数并且在 Scala 中不返回任何内容的函数,但我似乎无法在互联网上找到一个很好的解释来说明如何做到这一点。

我可以用 Java 实现该程序,但我真的很想知道如何在 Scala 中实现它。

4

1 回答 1

3

首先是一个示例函数(实际上是一个方法):

import java.io.File

def fileExists(file: File) = file.exists

以及将该函数(实际上是一个方法)作为参数传递给另一个函数的方法(实际上......你知道......):

def findFiles(files: Seq[File], predicate: (File) => Boolean) =
  files filter predicate

此方法接受一系列文件并过滤该序列,仅选择传递给定谓词的文件。在这种情况下,我们只返回现有文件:

findFiles(Seq(new File("a.txt"), new File("b.txt")), fileExists)

看看我们如何优雅地将exists方法作为参数传递?或者,如果您想手动调用谓词:

def fileMatches(file: File, predicate: (File) => Boolean) =
  predicate(file)

旁注:“ ...实际上是一种方法

findFiles() 方法predicate 函数作为参数。然而fileExists(),有一种方法——这是由于一种称为eta-expansion的机制而起作用的——透明地将方法包装到函数中。

于 2012-06-22T18:18:11.733 回答