Scala调用reduceLeft/Right时IntelliJ报cannot resolve symbol x错误
Scala调用reduceLeft/reduceRight提示
cannot resolve symbol x修复 问题现象
- 开发环境:IntelliJ IDEA Build #IC-221.5591.52(2022年5月10日构建),Scala SDK版本为scala-sdk-2.11.12
- 报错位置:以下两行代码提示符号x无法解析
println(lst.reduceLeft((x,y) => {println(x + " , "+ y) x +y})) println(lst.reduceRight((x,y) => {println(x + " , "+ y) x -y}))
报错根因
Scala默认以换行作为语句分隔标记,如果两个独立表达式写在同一行,必须用分号;显式分隔,否则编译器无法正确拆分语句结构。
上述报错代码的匿名函数块中,println打印语句和后续的计算返回值语句写在同一行且没有添加分隔符,编译器解析完println调用后,会把后面的x识别为未定义的新符号,直接抛出解析错误。该问题和IDEA版本、Scala SDK版本无关,IDEA给出的自动修复建议未命中语法错误点,所以无法解决问题。
修复方法
两种合法写法二选一即可:
- 同行写时添加分号分隔两个表达式
// 修复reduceLeft调用行 println(lst.reduceLeft((x,y) => {println(x + " , "+ y); x + y})) // 修复reduceRight调用行 println(lst.reduceRight((x,y) => {println(x + " , "+ y); x - y}))
- 两个表达式换行书写,Scala会自动识别语句分隔,无需额外加分号
println(lst.reduceLeft((x,y) => { println(x + " , "+ y) x + y })) println(lst.reduceRight((x,y) => { println(x + " , "+ y) x - y }))
额外代码结构问题修正
提供的完整测试代码中存在一个多余的空包定义块package pack {},会导致对象obj2被定义在包外,直接删除该空块即可正常运行,修复后的完整可运行代码如下:
//In Scala Reduce, fold or scan are most commonly used with collections in the form of reduceLeft, reduceRight, foldLeft, foldRight, scanLeft or scanRight. // In general, all functions apply a binary operator to each element of a collection. // The result of each step is passed on to the next step. object obj2 { println println("=====started=======") println val lst = List(1, 2, 3, 5, 7, 10, 13) val lst2 = List("A", "B", "C") def main(args: Array[String]) { println(lst.reduceLeft(_ + _)) println(lst2.reduceLeft(_ + _)) println(lst.reduceLeft((x,y) => {println(x + " , "+ y); x +y})) println(lst.reduceLeft(_ - _)) println(lst.reduceRight(_ - _)) println(lst.reduceRight((x,y) => {println(x + " , "+ y); x -y})) println(lst.foldLeft(100)(_ + _)) println(lst2.foldLeft("z")(_ + _)) println(lst.scanLeft(100)(_ + _)) println(lst2.scanLeft("z")(_ + _)) } }
内容的提问来源于stack exchange,提问作者Data2explore
相关产品推荐
相关产品推荐

