【问题标题】:Adding to scala mutable map fails添加到 scala 可变映射失败
【发布时间】:2013-11-16 05:01:49
【问题描述】:

我不明白为什么 += 在我事先定义一个元组 mapEntry 然后将其添加到地图时起作用,而尝试直接添加绕过创建不必要的变量 mapEntry 失败。很可能我遗漏了一些明显的东西。提前致谢。

这有效:map += mapEntry while 这失败了: map += ("key-to-tom", Person("Tom", "Marx"))

这是我完整的 scala REPL 会话

Welcome to Scala version 2.10.3 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_45).
Type in expressions to have them evaluated.
Type :help for more information.

scala> case class Person(val fname:String, val lname:String)
defined class Person

scala> val map = scala.collection.mutable.Map[String,Person]()
map: scala.collection.mutable.Map[String,Person] = Map()

scala> val mapEntry = ("key-to-joe", Person("Joe", "Smith") )
mapEntry: (String, Person) = (key-to-joe,Person(Joe,Smith))

scala> map += mapEntry
res0: map.type = Map(key-to-joe -> Person(Joe,Smith))

scala> val mapEntry2 = ("key-to-ann", Person("Ann", "Kline") )
mapEntry2: (String, Person) = (key-to-ann,Person(Ann,Kline))

scala> map += mapEntry2
res1: map.type = Map(key-to-joe -> Person(Joe,Smith), key-to-ann -> Person(Ann,Kline))

scala> map +=  ("key-to-tom", Person("Tom", "Marx") )
<console>:11: error: type mismatch;
 found   : String("key-to-tom")
 required: (String, Person)
              map +=  ("key-to-tom", Person("Tom", "Marx") )
                   ^

斯卡拉>

【问题讨论】:

    标签: scala collections


    【解决方案1】:

    您的最后一条语句失败,因为您需要将元组括在括号中以表示您正在添加一个元组:

    map +=  ( ("key-to-tom", Person("Tom", "Marx")) )
    

    问题是+= 过载。除了单个元组,+= 还可以接受两个或多个参数。签名是这样的:

    def +=(elem1: (A, B), elem2: (A, B), elems: (A, B)*): Map.this.type 
    

    您的元组是 Tuple2(与 Pair 相同,但仍然只是一个参数),并且这个重载方法需要 2 个参数(至少)。 Scala 选择后者作为更接近的匹配项。

    【讨论】:

    • 另外,你可以使用map += "key-to-tom" -&gt; Person("Tom", "Marx")语法
    • 感谢您的明确解释。我被“def +=(kv: (A, B)): Map.this.type”迷住了,没有再往下看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2011-03-26
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 2020-03-19
    • 2011-11-17
    相关资源
    最近更新 更多