首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala-IDE或Scala不正确的语法歧义

Scala-IDE或Scala不正确的语法歧义
EN

Stack Overflow用户
提问于 2011-12-29 22:14:52
回答 2查看 452关注 0票数 3

我正在使用Eclipse中的Scala-IDE学习Scala。在阅读第9章:控制抽象,第1部分:减少Scala编程中的代码重复时,我已经编写了该书中的代码(完整说明如下),它工作得很好!当我开始删除不必要的空行时,发生了一件奇怪的事情。下面是在删除filterFiles()方法中的空行之前的完整代码:

代码语言:javascript
复制
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()方法中删除空行后,该方法现在看起来如下所示:

代码语言:javascript
复制
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在正文的两行都给出了错误。第一行的错误是:

代码语言:javascript
复制
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)

第二行的错误是:

代码语言:javascript
复制
illegal start of simple expression

现在,在test()方法中对printArray()的所有三个调用也说明了这一点:

代码语言:javascript
复制
type mismatch; found : Unit required: Array[?]

这一切意味着什么?当代码对齐会破坏代码流时,Scala的行为不应该像Python那样……那么,为什么删除filterFiles()方法主体的第一行和第二行之间的空行会产生如此严重的错误呢?它是某个地方的bug,还是直接遵循Scala的规则?注意:如果我在行之间添加;,它将对所有内容进行排序。这只是分号推断错误吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-29 22:47:05

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

代码语言:javascript
复制
val files = object method arg

或者,在您的代码片段中

代码语言:javascript
复制
val files = object method
  arg

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

票数 4
EN

Stack Overflow用户

发布于 2011-12-29 22:46:19

看起来像你建议的分号推断问题,我猜如果你省略了括号,编译器就会期待方法参数。您可以在listFiles后面添加括号,而不是分号:

代码语言:javascript
复制
val files = (new java.io.File(path)) listFiles ()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8668910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档