我在Eclipse中使用Scala-IDE学习Scala。在遵循第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的规则?注意:如果我在行之间添加;
,它会排除所有内容。它只是分号推断错误吗?
答案 0 :(得分:4)
当object的方法无法或单个参数时,你可以像
一样调用它val files = object method arg
或,在您的代码段中
val files = object method
arg
在您的代码中,编译器希望使用listfiles
表达式调用for
作为返回Array[File]
的文件。并且抱怨listFiles
没有使用这种类型的参数实现。空行可防止将for
表达式视为listFiles
函数
答案 1 :(得分:2)
看起来像你建议的分号推断问题,我想如果你将括号括起来,编译器需要方法参数。您可以在listFiles:
之后添加括号,而不是分号val files = (new java.io.File(path)) listFiles ()