也许我错过了一些显而易见的东西,但这个简单的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)
我甚至尝试在应用代码中使地图变得可变,但它无法正常工作。
我在这里错过了什么吗?
感谢。
答案 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]
我希望这可以帮到你