下面是声明不可变 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.
有关 和 之间的区别,请参阅此答案。varval
即使您认为您的问题不是关于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也发生了变化。因为你没有看到这个,这意味着地图是不可变的,只有变量是。