1

下面是声明不可变 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")**
4

2 回答 2

8

Map是不可变的,但是您使用了一个mutable变量m(因为您将其声明为var)。

这一行m=m+(3->"hey")实际上创建了一个新地图并将其分配给您的变量m

尝试声明mval,看看你会得到一个编译错误。

但是 - 如果您将使用可变映射:

val m = scala.collection.mutable.Map[Int,String]

您将能够更新此地图(而您不能使用不可变地图执行此操作) -

m(3) = "hey"

或者

m.put(3,"hey")

这是您将更新地图内容的方式,无需重新创建或更改变量m(就像您之前使用 所做的那样m = m + ...),因为这里m被声明为val,这使得它不可变,但地图是可变的。

m = m + ..它被声明为val.

有关 和 之间的区别,请参阅此答案varval

于 2019-07-08T06:07:13.877 回答
3

即使您认为您的问题不是关于varor val,它实际上是:在您的示例中,是否m定义为varor非常重要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也发生了变化。因为你没有看到这个,这意味着地图是不可变的,只有变量是。

于 2019-07-08T06:25:43.317 回答