我不明白爲什麼作者說「Scala編程」中的代碼9.1使用閉包。在第9章,他們展示如何重構代碼轉換成更少重複的形式,從這種原始代碼:關於Scala Closure的問題(來自「Scala編程」)
object FileMatcher {
private def filesHere = (new java.io.File(".")).listFiles
def filesEnding(query: String) =
for (file <- filesHere; if file.getName.endsWith(query))
yield file
def filesContaining(query: String) =
for (file <- filesHere; if file.getName.contains(query))
yield file
def filesRegex(query: String) =
for (file <- filesHere; if file.getName.matches(query))
yield file
}
到了第二個版本:
object FileMatcher {
private def filesHere = (new java.io.File(".")).listFiles
def filesMatching(query: String,
matcher: (String, String) => Boolean) = {
for (file <- filesHere; if matcher(file.getName, query))
yield file
}
def filesEnding(query: String) =
filesMatching(query, _.endsWith(_))
def filesContaining(query: String) =
filesMatching(query, _.contains(_))
def filesRegex(query: String) =
filesMatching(query, _.matches(_))
}
,他們說,是沒有用封閉的這裏。現在我明白直到這一點。不過,他們推出了採用關閉的,甚至重構多一些,如清單9.1所示:
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))
}
現在,他們說,查詢是自由變量,但我真的不明白他們爲什麼這麼說?由於「」查詢「」似乎是從頂部方法明確傳遞到字符串匹配函數。
我正確理解,因爲「匹配器」方法捕獲變量「查詢」,因此它使用閉包。 – Ekkmanz 2009-07-05 05:26:23