2016-03-30 4 views
0

Vielleicht etwas offensichtlich, aber diese einfache App funktioniert nicht mir persönlich fehlt:Map-Einträge nicht in Programm Hinzufügen funktioniert aber in Interpreter

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

und legen Sie einen Haltepunkt in dem unmittelbar Debugger folgende diese Zeile, die Inhalt der Karte sind Map()

aber wenn ich das Äquivalent in der ers tun:

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) 

ich habe die Karte wandelbar in den App-Code macht sogar versucht, aber ich t funktioniert nicht.

Fehle ich hier etwas?

Danke.

+0

Add '=' zu berechnen 'def calculate =' –

+0

Ich wollte eigentlich zeigen, dass das Hinzufügen von Einträgen zur Karte nicht funktioniert, wenn eine Unit-Funktion verwendet wird. Ich möchte verstehen, ob es möglich ist, ein Instanzfeld als Nebeneffekt eines Funktionsaufrufs zu erzeugen. Diese Testfunktion ist nicht der eigentliche Code, aber sie emuliert das Verhalten, das ich versuche zu verstehen. –

Antwort

1

Sie vermissen die Zuordnung zu einem neuen Varibale auf der Karte nach der Zugabe:

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) 

Sie keine Instanz scala.collection.Map ändern kann, wie es unveränderlich ist. Wenn Sie eine wandelbar Karte wollen, müssen Sie scala.collection.mutable.Map verwenden:

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) 
+0

Ich dachte, dass durch die Verwendung einer Klasse Val würde Zustand halten, wie es in Java wäre. Ist das nicht der Fall? Es funktioniert auch nicht, wenn ich eine Var im Klassenbereich verwende. Ich hatte gehofft, diese Map in einer Klasseninstanz konstruieren zu lassen und sie aus dem lauffähigen Objekt zu holen. Im Wesentlichen nach dem gleichen Muster wie in Java. –

+0

OK, vielleicht möchten Sie eine veränderbare Map (ich habe der Antwort ein Sample hinzugefügt). Beachten Sie jedoch, dass die Verwendung von unveränderbaren Sammlungen bevorzugt wird, da dadurch der Code einfacher zu verstehen ist. – Sebastian

0

ich die Dokumentation folgte, http://docs.scala-lang.org/overviews/collections/maps.html, die ein veränderliches Karte impliziert hätte Elemente hinzugefügt, ohne dass eine neue Referenz eingeführt wird.

@Sebastian ist richtig, es muss eine var sein. Die Arbeitsversion wie folgt aussieht:

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

Denken Sie Ihren Code in Interpreter gearbeitet, weil es das Ergebnis sofort druckt (in diesem Fall aufgrund der Funktion +).

Deshalb erhalten Sie 2 unterschiedliche Antworten (c, res2).

Sie sollten versuchen zu erraten, Funktionstyp zu erraten.

es nicht: Void -> Void

es ist: Void -> Map [Int, Int]

Ich hoffe, das Ihnen helfen kann

Verwandte Themen