Scala-IDE или неоправданная синтаксическая неопределенность Scala - PullRequest
3 голосов
/ 29 декабря 2011

Я изучаю Scala с помощью Scala-IDE в Eclipse.Следуя Главе 9: Управление абстракцией, часть 1: Сокращение дублирования кода в книге «Программирование в Scala», я написал код из книги (полностью представлен ниже), он работал отлично!Когда я начал удалять ненужные пустые строки, произошло нечто странное.Вот весь код перед удалением пустых строк в методе filterFiles():

object Code_c09s01_ControlAbstraction extends App{

  object FilesFilter {

    private def filterFiles(path: String, pattern: String, matcher: (String, String) => Boolean) = {

      val files = (new java.io.File(path)) listFiles

      for(file <- files if matcher(file.getName, pattern)) yield file
    } 

    def filterExtension(path: String, pattern: String) = filterFiles(path, pattern, _.endsWith(_))
    def filterName(path: String, pattern: String) = filterFiles(path, pattern, _.contains(_))
    def filterRegex(path: String, pattern: String) = filterFiles(path, pattern, _.matches(_))
  }

  def printArray[A](message: String, arr: Array[A]) {
    println (message)
    println (arr mkString("\n"))
  }

  def test() {
    val path = "C:\\";

    printArray("--- filtering by ext: ---", FilesFilter.filterExtension(path, ".txt"))
    printArray("--- filtering by containment: ---", FilesFilter.filterName(path, "1"))
    printArray("--- filtering by regex: ---", FilesFilter.filterRegex(path, "."))
  }

  test

}

, который работает просто отлично!Однако после удаления пустых строк из метода filterFiles() метод теперь выглядит следующим образом:

private def filterFiles(path: String, pattern: String, matcher: (String, String) => Boolean) = {
  val files = (new java.io.File(path)) listFiles
  for(file <- files if matcher(file.getName, pattern)) yield file
} 

И среда IDE выдает ошибки в обеих строках тела.Ошибка в первой строке говорит:

ambiguous reference to overloaded definition, both method listFiles in class File of type (x$1: java.io.FileFilter)Array[java.io.File] and method listFiles in class File of type 
 (x$1: java.io.FilenameFilter)Array[java.io.File] match argument types (Null)

ошибка во второй строке говорит:

illegal start of simple expression

и все три вызова printArray() в методе test()теперь также скажи это:

type mismatch; found : Unit required: Array[?]

Что все это значит?Scala не должен вести себя как Python, когда выравнивание кода может испортить поток кода ... так почему же удаление пустой строки между первой и второй строкой тела метода filterFiles() приводит к такой серьезной ошибке?Это где-то ошибка или это следует непосредственно из правил Scala?Примечание: если я добавлю ; между строк, это все уладит.Это ошибка вывода с запятой?

Ответы [ 2 ]

4 голосов
/ 29 декабря 2011

Когда метод объекта не может содержать ни одного аргумента, вы можете вызвать его как

val files = object method arg

или, в вашем фрагменте

val files = object method
  arg

В вашем коде компилятор хочет вызвать listfiles с выражением for в качестве аргумента, который возвращает Array[File]. И жалуется, что listFiles не имеет реализации с этим типом аргумента. Пустая строка не позволяет рассматривать выражение for как параметр для listFiles function

2 голосов
/ 29 декабря 2011

Выглядит как проблема вывода точки с запятой, как вы предлагаете, я думаю, что компилятор ожидает аргументы метода, если вы оставите скобки. Вместо точки с запятой вы можете добавить скобки после listFiles:

val files = (new java.io.File(path)) listFiles ()
...