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的规则?注意:如果我在该行之间添加;
,它会将所有内容排序。它只是分号推理错误?
当对象的方法可以没有或一个参数,你可以这样调用它
val files = object method arg
,或者在你的代码片段
val files = object method
arg
在您的代码中,编译器想要将listfiles
与for
表达式作为返回Array[File]
的文件夹。并抱怨listFiles
没有实现这种类型的参数。空行防止将for
表达式作为参数处理listFiles
函数
嗯,我没有注意到任何其他相关的语言,空行可以做这种伎俩。有点令人费解的体验) – noncom 2011-12-29 17:29:50
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()
它与Python不同,因为您不需要依赖对齐或空格:例如,可以在每个语句的末尾添加分号。 – Philippe 2011-12-29 15:47:08
是的,这绝对是一件值得记住的事情。 – noncom 2011-12-29 17:28:26