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 に答える