使用Map中元组为数组赋值时提示参数过多问题排查
问题分析与解决
这个问题我之前帮人排查过,其实就是对Scala二维数组的访问语法理解错了~
你碰到的too many arguments for method update错误,核心原因是:Scala里的二维数组本质是「数组的数组」,不是原生的二维结构。
用Array.ofDim[String](3, 3)创建的boardRep,实际类型是Array[Array[String]]——外层数组的每个元素都是一个字符串数组(对应二维数组的一行)。所以要给某个位置赋值,得先定位到行数组,再定位到行里的列元素,正确语法是boardRep(row)(col) = value,而不是像其他语言那样用boardRep(row, col)。
你原来的代码里boardRep((key._1), (key._2)) = value,会被Scala解析成调用boardRep.update(key._1, key._2, value),但Array的update方法只接受两个参数(索引和要设置的值),这就导致了「参数过多」的错误。
修正后的代码
把访问方式改成两层括号,同时可以优化一下模式匹配的写法,让代码更直观:
val a = Map((1,1) -> "alex", (2,2) -> "Jade") val boardRep = Array.ofDim[String](3, 3) a foreach { case ((row, col), value) => boardRep(row)(col) = value }
这样修改后,运行就能达到你的预期:
boardRep(1)(1)的值是"alex"boardRep(2)(2)的值是"Jade"
其他未赋值的位置会是String数组的默认初始值null。
小补充
如果实在习惯了boardRep(row, col)这种写法,也可以通过隐式类给二维数组扩展一个支持该语法的update方法,但日常开发中用原生的boardRep(row)(col)已经足够简洁,没必要额外封装。
内容的提问来源于stack exchange,提问作者Aman Jha
相关产品推荐
相关产品推荐

