필자가 "스칼라로 프로그래밍"의 코드 9.1이 클로저를 사용한다고 말한 이유를 알지 못합니다.스칼라 클로저에 대한 질문 ("스칼라 프로그래밍"에서)
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(_))
}
들이 폐쇄 아무 소용이 없다고 말했다 : 두 번째 버전으로
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
}
: 제 9 장, 그들은이 원래의 코드에서, 더 적은 중복 된 형태로 코드를 리팩토링하는 방법을 보여줍니다 이리. 이제 나는이 시점까지 이해한다.
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))
}
지금 그들이
쿼리 자유 변수라고 말했지만 그들이 그렇게 말했다 왜 난 정말 이해가 안 : 그러나 그들은 좀 더, 9.1 목록에 표시도 리팩토링하는
폐쇄의 사용을 도입? ""쿼리 ""가기 메서드에서 문자열 일치 함수를 명시 적으로 전달 된 것으로 보인다.
"matcher"메서드는 변수 "query"를 캡처하므로 closure를 사용하기 때문에 올바르게 이해합니다. – Ekkmanz
예,이 코드에서 "def filesEnding (query : String) = filesMatching (_. endsWith (query))"람다 "_.endsWith (query)"가 있는데,이 때 "{x => x .endsWith (쿼리)} ". schemey 표기법에서는 "(lambda (x) (endwith x query))"와 같이 보입니다. 보시다시피, 람다에서 "쿼리"는 자유 변수입니다. 그것은 인수로서 또는 람다에있는 let으로 묶여 있지 않으므로 클로저가 형성 될 때 질의는 포함하는 환경에서 캡처됩니다. "filesEnding"과 같은 메소드의 호출. –