+ =操作在scala地图中真正做了什么?

时间:2015-12-22 03:08:26

标签: scala

如代码所示:

val map = scala.collection.mutable.Map[Int, Int]().withDefaultValue(0)
println(map(1))
map(1) = 10
println(map(1))
map(1) += 10
println(map(1))

和输出:

0
10
20

但是,在我看来,“map(1)+ = 10”在java中无效,甚至有效,此行后的结果map(1)应该是10。

为什么???以及“+ =”在地图中的确切操作是什么?

3 个答案:

答案 0 :(得分:6)

首先,// Set timer which handles sending further reads until trigger is released this.ReaderTimer.Interval = 2000; this.ReaderTimer.Enabled = true; assignment operator,因为它以+=结尾,而不是比较运算符。这意味着如果没有合适的方法(且=没有Int方法),则+=会转换为map(1) += 10。根据{{​​3}}中的规则,变为map(1) = map(1) + 10变为map.update(1, map(1) + 10),因为map.update(1, map.apply(1) + 10)是对象而不是一种方法。

答案 1 :(得分:3)

提出的问题'究竟是什么操作" + ="在地图上做什么?'与您描述的情况无关。地图的方法+ =将条目(键 - >值)添加到地图,以便地图(键)==值。

所以问题是:map(1)+ = 10是什么。

这个简单的行

  map(1) += 10

编译成这个javacode

  24: invokestatic  #36                 // Method scala/runtime/BoxesRunTime.boxToInteger:(I)Ljava/lang/Integer;
  27: aload_2
  28: iconst_1
  29: invokestatic  #36                 // Method scala/runtime/BoxesRunTime.boxToInteger:(I)Ljava/lang/Integer;
  32: invokeinterface #43,  2           // InterfaceMethod scala/collection/mutable/Map.apply:(Ljava/lang/Object;)Ljava/lang/Object;
  37: invokestatic  #47                 // Method scala/runtime/BoxesRunTime.unboxToInt:(Ljava/lang/Object;)I
  40: bipush        10
  42: iadd
  43: invokestatic  #36                 // Method scala/runtime/BoxesRunTime.boxToInteger:(I)Ljava/lang/Integer;
  46: invokeinterface #51,  3           // InterfaceMethod scala/collection/mutable/Map.update:(Ljava/lang/Object;Ljava/lang/Object;)V

删除拳击和拆箱操作 - 我们对它们不感兴趣(第24,29,37,43行)。回顾其余部分:

我们获得地图中的价值

  27: aload_2
  28: iconst_1
  32: invokeinterface #43,  2           // InterfaceMethod scala/collection/mutable/Map.apply:(Ljava/lang/Object;)Ljava/lang/Object;

添加10:

  40: bipush        10
  42: iadd

完成更新:

  46: invokeinterface #51,  3           // InterfaceMethod scala/collection/mutable/Map.update:(Ljava/lang/Object;Ljava/lang/Object;)V

似乎地图(1)+ = 10是desugared to map.update(1,map.apply(1)+ 10)

答案 2 :(得分:0)

在Scala地图中。 +=表示

ms += (k -> v)  Adds mapping from key k to value v to map ms as a side effect and returns ms itself.

ms += (k -> v, l -> w)  Adds the given mappings to ms as a side effect and returns ms itself.