Scala-IDE或Scala不合理的语法歧义

问题描述:

我在Eclipse中学习Scala和Scala-IDE。虽然遵循了第9章:控制抽象,第1部分:减少Scala编程中的代码重复,但我已经从书中编写了代码(完全如下),它工作的很好!当我开始删除不必要的空白行时,发生了一件奇怪的事情。这里是去除空行前的全部代码在filterFiles()方法:Scala-IDE或Scala不合理的语法歧义

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 

和所有在test()方法的三个电话到printArray()现在还讲这个:

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

这是什么意思?当代码对齐可能会破坏代码流时,Scala不应该像Python一样行事......那么如何去除filterFiles()方法正文的第一行和第二行之间的空白行会产生如此严重的错误?它是一个错误的地方,还是直接遵循Scala的规则?注意:如果我在该行之间添加;,它会将所有内容排序。它只是分号推理错误?

+0

它与Python不同,因为您不需要依赖对齐或空格:例如,可以在每个语句的末尾添加分号。 – Philippe 2011-12-29 15:47:08

+0

是的,这绝对是一件值得记住的事情。 – noncom 2011-12-29 17:28:26

当对象的方法可以没有或一个参数,你可以这样调用它

val files = object method arg 

,或者在你的代码片段

val files = object method 
    arg 

在您的代码中,编译器想要将listfilesfor表达式作为返回Array[File]的文件夹。并抱怨listFiles没有实现这种类型的参数。空行防止将for表达式作为参数处理listFiles函数

+0

嗯,我没有注意到任何其他相关的语言,空行可以做这种伎俩。有点令人费解的体验)​​ – noncom 2011-12-29 17:29:50

+1

Scala IDE有一个名为[显示推断分号](http://scala-ide.org/docs/user/features/typingviewing.html#show-inferred-semicolons)的功能,它添加了推断分号在当前编辑器中。这有助于排查像这样的错误。 – 2011-12-30 12:48:55

看起来像分号推理问题,如你所建议的,我猜如果你将圆括号取出,编译器会期望方法参数。相反分号,你可以listFiles后加括号:

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