Ich habe die folgende Klasse machen:Wie unveränderlich 2D Array in Scala
class Matrix(val matrix: Array[Array[Int]]) {
// some other methods
override def toString: String = {
return matrix.map(_.mkString(" ")).mkString("\n")
}
}
I Klasse Variable deklariert haben als val
in matrix
weitere Modifikation zu verhindern.
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)
}
}
Nach x(1)(1) = 101
tun die Ausgabe des Programms ist
m1 -->
1 2 3
4 101 6
7 8 9
Aber ich will diese Änderung verhindern und die ursprüngliche Matrix als
m1 -->
1 2 3
4 5 6
7 8 9
'val' macht nur die Variable nicht durch andere Sammlung neu zugewiesen werden, aber man kann immer noch das Feld in der Sammlung neu zuweisen –
Können Sie mir sagen, wie Sie diese Änderung verhindern können? –
Verwenden Sie einen unveränderlichen Datentyp anstelle eines änderbaren Datentyps. 'Array' ist veränderbar (auch wenn der Verweis darauf nicht ist). Sie können einfach "IndexedSeq" verwenden, das als generisches Merkmal für Sequenzen mit konstantem Direktzugriff dient. Die offizielle Dokumentation hat ein sehr interessantes Kapitel über Sammlungen und ihre Eigenschaften: http://docs.scala-lang.org/overviews/collections/overview.html – stefanobaghino