Scala数组理解?

Scala数组理解?,scala,Scala,我在scala控制台中尝试了以下数组示例。声明为不可变数组时,尝试更改数组索引值。不可变不应允许修改值。我不明白发生了什么事,谁能解释一下吗 val numbers=Array(1,2,3) numbers(0)=5 print numbers res1: Array[Int] = Array(5, 2, 3) 谢谢 也许您对scala数组的理解不正确 请注意以下原则 数组保留顺序,可以包含重复项,并且是可变的 scala> val numbers = Array(1, 2, 3, 4,

我在scala控制台中尝试了以下数组示例。声明为不可变数组时,尝试更改数组索引值。不可变不应允许修改值。我不明白发生了什么事,谁能解释一下吗

val numbers=Array(1,2,3)
numbers(0)=5
print numbers
res1: Array[Int] = Array(5, 2, 3)

谢谢

也许您对scala数组的理解不正确

请注意以下原则

数组保留顺序,可以包含重复项,并且是可变的

scala> val numbers = Array(1, 2, 3, 4, 5, 1, 2, 3, 4, 5)
numbers: Array[Int] = Array(1, 2, 3, 4, 5, 1, 2, 3, 4, 5)

scala> numbers(3) = 10
列表保留顺序,可以包含重复项,并且是不可变的

scala> val numbers = List(1, 2, 3, 4, 5, 1, 2, 3, 4, 5)
numbers: List[Int] = List(1, 2, 3, 4, 5, 1, 2, 3, 4, 5)

scala> numbers(3) = 10
<console>:9: error: value update is not a member of List[Int]
              numbers(3) = 10
scala>val numbers=List(1,2,3,4,5,1,2,3,4,5)
数字:List[Int]=List(1,2,3,4,5,1,2,3,4,5)
scala>数字(3)=10
:9:错误:值更新不是列表[Int]的成员
数字(3)=10

也许您对scala数组的理解不正确

请注意以下原则

数组保留顺序,可以包含重复项,并且是可变的

scala> val numbers = Array(1, 2, 3, 4, 5, 1, 2, 3, 4, 5)
numbers: Array[Int] = Array(1, 2, 3, 4, 5, 1, 2, 3, 4, 5)

scala> numbers(3) = 10
列表保留顺序,可以包含重复项,并且是不可变的

scala> val numbers = List(1, 2, 3, 4, 5, 1, 2, 3, 4, 5)
numbers: List[Int] = List(1, 2, 3, 4, 5, 1, 2, 3, 4, 5)

scala> numbers(3) = 10
<console>:9: error: value update is not a member of List[Int]
              numbers(3) = 10
scala>val numbers=List(1,2,3,4,5,1,2,3,4,5)
数字:List[Int]=List(1,2,3,4,5,1,2,3,4,5)
scala>数字(3)=10
:9:错误:值更新不是列表[Int]的成员
数字(3)=10

您没有声明不可变数组数组是可变的

您可能会混淆的是
val
vs
var
的确切含义
val
不会使对象不可变,它会使引用不可变,因此您无法为变量重新分配不同的数组,但您仍然可以修改内容,因为它是一个可变对象


如果您想要不可变,您需要将
val
与不可变对象(如
Vector
List
)一起使用。您没有声明不可变数组数组是可变的

您可能会混淆的是
val
vs
var
的确切含义
val
不会使对象不可变,它会使引用不可变,因此您无法为变量重新分配不同的数组,但您仍然可以修改内容,因为它是一个可变对象


如果您想要不可变,您需要将
val
与不可变对象一起使用,如
Vector
List

将某物声明为
val
不会使其不可变。它只会阻止重新分配。例如,以下代码无法编译:

val numbers = Array(1, 2, 3)
numbers = Array(5, 2, 3)
请注意,上面代码中的更改与数组对象的内部状态无关:更改的是名称
numbers
引用的数组。在第一行,名称
numbers
指数组
array(1,2,3)
,但在第二行,我们尝试将名称
numbers
重新分配给数组
数组(5,2,3)
(编译器不允许这样做,因为名称
numbers
是使用
val
声明的)

相反,允许使用以下代码:

val numbers = Array(1, 2, 3)
numbers(0) = 5

在这段代码中,名称
numbers
仍然指向同一个数组,但是数组的内部状态发生了变化。使用
val
关键字作为对象的名称不能防止该对象的内部状态发生更改,
val
关键字只能防止名称被重新分配给其他对象。

将某个对象声明为
val
并不会使其不可变。它只会阻止重新分配。例如,以下代码无法编译:

val numbers = Array(1, 2, 3)
numbers = Array(5, 2, 3)
请注意,上面代码中的更改与数组对象的内部状态无关:更改的是名称
numbers
引用的数组。在第一行,名称
numbers
指数组
array(1,2,3)
,但在第二行,我们尝试将名称
numbers
重新分配给数组
数组(5,2,3)
(编译器不允许这样做,因为名称
numbers
是使用
val
声明的)

相反,允许使用以下代码:

val numbers = Array(1, 2, 3)
numbers(0) = 5

在这段代码中,名称
numbers
仍然指向同一个数组,但是数组的内部状态发生了变化。使用
val
关键字作为对象的名称无法防止该对象的内部状态发生更改,而
val
关键字只能防止名称被重新分配给其他对象。

可能的重复,因为默认数组与Java的数组相同,的可能重复,因为默认数组与Java的数组相同,后者是可变的。