gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:03:21 26 4
gpt4 key购买 nike

我正在使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com