Попытка обернуть мою голову вокруг различных применений _
. Сейчас я борюсь с этим примером:Scala использование подчеркивания в качестве объекта-заполнителя
object Chapter9 extends App {
FileMatcher.filesEnding(".scala").foreach(println)
}
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))
}
Итак, ясно, мы хотим, чтобы абстрагироваться от совместной работы зацикливания/фильтрации/уступая для различных типов matchers, имеет смысл поместить его в вспомогательной функции.
Я получаю повесил трубку на участке _.endsWith
. Я понимаю, что это подчеркивание (являющееся первым и единственным, используемым в теле метода) будет заполнено первым параметром, который в этом случае равен query
. Я попытался проверить эту теорию, выполнив:
def filesEnding(query: String) = {
println(_: String)
}
Но программа ничего не печатает. Итак, что здесь _
? Как Scala знает, на каком объекте искать метод endsWith
?
Похоже на выход программы, что как-то file
заполняется для этого подчеркивания, но понятия не имеет, как. Может быть, подчеркивание остается «шаблон», пока он не используется внутри тела filesMatching
«s и к тому моменту ближайшей вшита сфера является for
и первым«параметр is
file`?
http://stackoverflow.com/questions/8000903/what-are-all-the-uses-of-an-underscore-in-scala –
http://stackoverflow.com/questions/1025181/hidden-features -of-scala/1083523 # 1083523 –
Я не могу сказать, голосовать ли, потому что вопрос не имеет большого смысла, или же это путаница для новых пользователей. Их много. –