Scala函数内使用ArrayBuffer的+=方法报错问题求助
解决Scala中ArrayBuffer追加值时的编译错误
嘿,你这是踩了Scala方法定义的一个小语法坑啦!咱们一步步拆解问题:
错误根源
你的代码里,方法test的返回类型声明后面少了一个等号=。在Scala中,如果方法需要返回值,必须用=连接返回类型和方法体的花括号;要是省略=,编译器会把这个方法当成不返回任何值的“过程”(类似Java的void方法),这时候方法体里的代码会被当成声明语句处理,自然就触发编译错误了。
你的错误代码
def test() : (String,ArrayBuffer[(String,String,String)]) { val outstr=mutable.ArrayBuffer[(String,String,String)]() val testnmae="TESTING" val t=("A1","B1","C1"); val t2=("A2","B2","C2"); val t3=("A3","B3","C3"); outstr += t; // 这里会报"illegal start of declaration"错误 }
修正后的代码
只需要在返回类型后面补上=,同时记得导入ArrayBuffer(或者使用全限定名),代码就能正常运行了:
import scala.collection.mutable.ArrayBuffer def test(): (String, ArrayBuffer[(String, String, String)]) = { val outstr = ArrayBuffer[(String, String, String)]() val testname = "TESTING" val t = ("A1", "B1", "C1") val t2 = ("A2", "B2", "C2") val t3 = ("A3", "B3", "C3") outstr += t outstr += t2 // 可以继续追加其他元素 (testname, outstr) // 最后返回符合方法返回类型的元组 }
为什么REPL里没问题?
因为REPL是交互式逐行执行环境,你在REPL里的操作都是顶层表达式,不需要包裹在方法中,直接创建ArrayBuffer并追加元素的语法是完全合法的,自然不会出现编译错误。
内容的提问来源于stack exchange,提问作者Arjuna Das
相关产品推荐
相关产品推荐

