添加映射条目在程序中失败,但在解释器中工作

时间:2016-03-30 20:19:51

标签: scala

也许我错过了一些显而易见的东西,但这个简单的App并不起作用:

object runnable extends App {
   Test.calculate
}
object Test {
  val c = Map[Int, Int]()
  def calculate {
    c + ( 1 -> 2 )
  }
...

在调试器中紧跟该行后设置一个断点,地图内容为Map()

但如果我在repl中做同等的事情:

val c = Map[Int,Int]()
c: scala.collection.immutable.Map[Int,Int] = Map()
c+(1->2)
res2: scala.collection.immutable.Map[Int,Int] = Map(1 -> 2)

我甚至尝试在应用代码中使地图变得可变,但它无法正常工作。

我在这里错过了什么吗?

感谢。

3 个答案:

答案 0 :(得分:1)

添加到地图后,您错过了对新varibale的分配:

val c1 = Map[Int, Int]()
val c2 = c1 + (1 -> 2)
println(c2) // Map(1 -> 2)

// using a var instead
var c = Map[Int, Int]()
c = c + (1 -> 2)
println(c)  // Map(1 -> 2)

您无法更改scala.collection.Map的实例,因为它是不可变。如果您需要可变地图,则需要使用scala.collection.mutable.Map

val c = scala.collection.mutable.Map[Int, Int]()
// the next three lines are differnt ways to add an element
c.put(1, 2)
c(1) = 2
c += 1 -> 2
println(c)  // Map(1 -> 2)

答案 1 :(得分:0)

我正在关注文档http://docs.scala-lang.org/overviews/collections/maps.html,这意味着可变地图可以在不引入新引用的情况下添加元素。

@Sebastian是正确的,它需要是一个var。工作版本如下:

object runnable extends App {
   Test.calculate
}
object Test {
   var c = Map[Int, Int]()
   def calculate {
     c += ( 1 -> 2 )
   }
...

答案 2 :(得分:0)

认为您的代码在解释器中工作,因为它会立即打印结果(在这种情况下是函数的结果+)。

这就是为什么你得到2个不同的回复( c,res2 )。

您应该尝试猜测计算函数类型。

不是: Void - >空隙

它是: Void - > Map [Int,Int]

我希望这可以帮到你