下面是声明不可变 Map 的 scala 代码
var m:Map[Int,String] = Map(1->"hi",2->"hello")
println(m)
// Result: Map(1->"hi",2->"hello")
在这里我们可以添加或更改 Map 的内容,那么我们怎么能说 scala 中的地图或列表是不可变的
m=m+(3->"hey")
println(m)
// Result: Map(1->"hi",2->"hello",3->"hey")**
下面是声明不可变 Map 的 scala 代码
var m:Map[Int,String] = Map(1->"hi",2->"hello")
println(m)
// Result: Map(1->"hi",2->"hello")
在这里我们可以添加或更改 Map 的内容,那么我们怎么能说 scala 中的地图或列表是不可变的
m=m+(3->"hey")
println(m)
// Result: Map(1->"hi",2->"hello",3->"hey")**
Map
是不可变的,但是您使用了一个mutable
变量m
(因为您将其声明为var
)。
这一行m=m+(3->"hey")
实际上创建了一个新地图并将其分配给您的变量m
。
尝试声明m
为val
,看看你会得到一个编译错误。
但是 - 如果您将使用可变映射:
val m = scala.collection.mutable.Map[Int,String]
您将能够更新此地图(而您不能使用不可变地图执行此操作) -
m(3) = "hey"
或者
m.put(3,"hey")
这是您将更新地图内容的方式,无需重新创建或更改变量m
(就像您之前使用 所做的那样m = m + ...
),因为这里m
被声明为val
,这使得它不可变,但地图是可变的。
当m = m + ..
它被声明为val
.
有关 和 之间的区别,请参阅此答案。var
val
即使您认为您的问题不是关于var
or val
,它实际上是:在您的示例中,是否m
定义为var
or非常重要val
。在您的示例中,即使您看到地图已更改,但实际上并未更改:您的代码创建另一个地图并将其分配给相同的变量。地图本身并没有改变,因为它是不可变的。您可以在此代码中观察到这一点:
val m1 = Map(1 -> "hi", 2 -> "hello")
var m = m1
m = m + (3 -> "hey")
println(m) // prints Map(1 -> ..., 2 -> ..., 3 -> ...)
println(m1) // prints Map(1 -> ..., 2 -> ...)
如果Map
在这里是可变的,你会看到它m1
也发生了变化。因为你没有看到这个,这意味着地图是不可变的,只有变量是。