如代码所示:
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。
为什么???以及“+ =”在地图中的确切操作是什么?
答案 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.