2012-01-18 6 views
2

私はScalaを学ぼうとしていますが、私はこの例を理解できません。 OderskyらによるProgramming in Scala 9.1を参照してください。 al。は、著者は、彼らはあなたが他の人によって書かれたクライアントコードが使用するFileMatcherオブジェクトを作成しているシナリオを与えるこのコードScalaのクローズ

object FileMatcher { 
    private def filesHere = (new java.io.File(".")).listFiles 
    private def filesMatching(matcher: String => Boolean) = 
    for (file <- filesHere; if matcher(file.getName)) 
     yield file 
    def filesEnding(query: String) = 
    filesMatching(_.endsWith(query)) 
    def filesContaining(query: String) = 
    filesMatching(_.contains(query)) 
    def filesRegex(query: String) = 
    filesMatching(_.matches(query)) 
} 

を生成し、このコードは、リファクタリングのカップルの結果です。

私はクエリが自由変数だと理解していますが、呼び出し元がどのようにそれを利用するのか分かりません。 Scalaは正しく理解していればレキシカルスコープであり、これはオブジェクト定義であるため、クライアントは字句を囲むスコープでクエリを定義することはできません。

クライアントがファイルエンディングを呼び出して、 ".txt"で終わるすべてのファイルを見つける方法の例を教えてください。

+4

FileMatcher.filesEnding( "txt") – Apocalisp

+0

この方法では、クロージャを使用して直接呼び出すことはできません。ただし、呼び出すメソッドはクロージャを使用します。_.endsWith(query) – thoredge

+1

クエリは、完全に標準的なメソッドパラメータです。 – soc

答えて

6

お試しください。

scala> object FileMatcher { 
    | private def filesHere = (new java.io.File(".")).listFiles 
    | private def filesMatching(matcher: String => Boolean) = 
    |  for (file <- filesHere; if matcher(file.getName)) 
    |  yield file 
    | def filesEnding(query: String) = 
    |  filesMatching(_.endsWith(query)) 
    | def filesContaining(query: String) = 
    |  filesMatching(_.contains(query)) 
    | def filesRegex(query: String) = 
    |  filesMatching(_.matches(query)) 
    | } 
defined module FileMatcher 

scala> FileMatcher filesEnding "xml" 
res7: Array[java.io.File] = Array(./build.examples.xml, ./build.xml, ./build.detach.xml) 

scala> FileMatcher filesContaining "example" 
res8: Array[java.io.File] = Array(./build.examples.xml) 

さらにご質問がありましたら、追加してください。

関連する問題