繁体   English   中英

Scala-IDE或Scala没有合理的语法歧义

[英]Scala-IDE or Scala unjustified syntax ambiguity

我在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

并且test()方法中对printArray()所有三次调用现在也告诉我:

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

这是什么意思呢? 代码对齐可能会破坏代码流,Scala不应该像Python一样......那么为什么删除filterFiles()方法体的第一行和第二行之间的空行会产生如此严重的错误? 它是某个地方的错误还是直接遵循Scala的规则? 注意:如果我添加; 在线之间,它排除了一切。 它只是分号推断错误吗?

当object的方法无法或单个参数时,你可以像调用它一样

val files = object method arg

或者,在你的片段中

val files = object method
  arg

在您的代码中,编译器希望使用for表达式调用listfiles作为返回Array[File] 并抱怨listFiles没有使用这种类型的参数实现。 空线防止处理for表达作为一个参数listFiles功能

看起来像你建议的分号推断问题,我想如果你将括号括起来,编译器需要方法参数。 您可以在listFiles之后添加括号,而不是分号:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM