Я изучаю 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?Примечание: если я добавлю ;
между строк, это все уладит.Это ошибка вывода с запятой?