Затворы в Скале - PullRequest
       1

Затворы в Скале

2 голосов
/ 18 января 2012

Я пытаюсь выучить Scala и не могу понять этот пример. В листинге 9.1 Программирование в Scala, Odersky et. al., авторы выпускают этот код

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))
}

Они дают сценарий, в котором вы пишете объект FileMatcher для использования клиентским кодом, написанным другими, и этот код является результатом нескольких рефакторингов.

Я понимаю, что запрос является свободной переменной, но я не понимаю, как вызывающий объект должен использовать его. Поскольку Scala, если я правильно понимаю, имеет лексическую область, и это определение объекта, клиент не может определить запрос в лексически заключенной области, так откуда же запрос?

Можете ли вы привести пример того, как клиент должен вызывать filesEnding, чтобы найти все файлы, оканчивающиеся на ".txt", например?

1 Ответ

6 голосов
/ 18 января 2012

Попробуйте.

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)

Если у вас есть дополнительные вопросы, пожалуйста, добавьте их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...