我有下面的类:如何使一成不变的二维数组在斯卡拉
class Matrix(val matrix: Array[Array[Int]]) {
// some other methods
override def toString: String = {
return matrix.map(_.mkString(" ")).mkString("\n")
}
}
我宣布类变量val
防止matrix
进一步修改。
object Main {
def main(args: Array[String]) {
val > = Array
val x: Array[Array[Int]] = >(
>(1, 2, 3),
>(4, 5, 6),
>(7, 8, 9))
val m1 = new Matrix(x)
println("m1 -->\n" + m1)
x(1)(1) = 101 // Need to prevent this type of modification.
println("m1 -->\n" + m1)
}
}
做x(1)(1) = 101
后,程序的输出
m1 -->
1 2 3
4 101 6
7 8 9
但我想避免这种情况的修改,并得到原矩阵
m1 -->
1 2 3
4 5 6
7 8 9
'val'不仅使变量不能被其他集合被重新分配,但你仍然可以在集合中重新分配领域 –
你能告诉我如何防止这种修改? –
使用不可变数据类型而不是可变数据类型。 'Array'是可变的(即使对它的引用不是)。您可以简单地使用'IndexedSeq'作为具有常量随机访问序列的通用特征。官方文件有一个关于馆藏及其特点的非常有趣的章节:http://docs.scala-lang.org/overviews/collections/overview.html – stefanobaghino