作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Eclipse 中的 Scala-IDE 学习 Scala。在遵循《Scala 编程》一书中的第 9 章:控制抽象,第 1 部分:减少代码重复时,我已经编写了书中的代码(下面完整表示),它运行良好!当我开始删除不必要的空行时,一件奇怪的事情发生了。以下是删除 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
test()
方法中对 printArray()
的所有三个调用现在也说明了这一点:
type mismatch; found : Unit required: Array[?]
这是什么意思?当代码对齐会破坏代码流时,Scala 不应该像 Python 那样运行......那么为什么要删除 filterFiles()
方法主体的第一行和第二行之间的空行犯这么严重的错误?它是某处的错误还是直接遵循 Scala 的规则?注意:如果我在行之间添加 ;
,它会整理所有内容。这只是分号推理错误吗?
最佳答案
当对象的方法可以没有或只有一个参数时,你可以这样调用它
val files = object method arg
或者,在您的代码段中
val files = object method
arg
在您的代码中,编译器希望使用 for
表达式调用 listfiles
作为返回 Array[File]
的参数。并提示 listFiles
没有使用这种类型的参数实现。空行阻止将 for
表达式作为 listFiles
函数的参数
关于Scala-IDE 或 Scala 不合理的语法歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8668910/
我是一名优秀的程序员,十分优秀!