Scala数组理解?
我在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,
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
vsvar
的确切含义val
不会使对象不可变,它会使引用不可变,因此您无法为变量重新分配不同的数组,但您仍然可以修改内容,因为它是一个可变对象
如果您想要不可变,您需要将
val
与不可变对象(如Vector
或List
)一起使用。您没有声明不可变数组val
vsvar
的确切含义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的数组相同,后者是可变的。