2016-04-20 26 views
1

Ziemlich neu zu clojure also sei nett.Warum wird meine Karte nicht aktualisiert?

(def state {:currentPosition "1"}) 

(while (not= (state :currentPosition) "2") ; this is true 
    (assoc state :currentPosition "2") ; 
)  

Dies bewirkt eine Endlosschleife und es wird nicht laufen, aber ich verstehe nicht, warum. Die Bedingung

(not= (state :currentPosition) "2") 

gilt

daher die Schleife beginnt, dann in der Schleife, ich den Zustand bin zu aktualisieren. Warum hört der Loop nicht auf und bleibt nur der Leuchttisch stehen? Danke

+1

Ben, Piotrs Antwort ist korrekt, was Sie speziell gefragt haben. Sie wissen das vielleicht, aber die Art von Dingen, die Sie tun, ist nicht idiomatisch. (Manchmal müssen Sie das auch tun, deshalb gibt es Atome.) Es ist in Ordnung, die Dinge so zu machen, wie Sie es gewohnt sind, wenn Sie die Sprache lernen, aber Sie werden Clojure- lernen wollen. Style-Coding-Strategien ziemlich schnell. Es kann zunächst etwas peinlich sein, aber sobald Sie sich an die funktionale Programmierung gewöhnt haben, ist es schön und macht Spaß (imho). Wenn ich Ihnen Dinge erzähle, die Sie bereits gehört haben, ignorieren Sie diesen Kommentar. – Mars

+0

Ich stimme völlig zu, ich versuche "normal" zu programmieren. Es ist nur eine echte große Veränderung zu dem, was ich gewohnt bin lol – Ben

Antwort

6

Clojure datastructures sind unveränderlich, also (assoc state :currentPosition "2") mutiert das Objekt nicht, das state var zugewiesen wird, aber gibt nur eine neue Version einer Karte zurück.

Wenn Sie die Werte in Ihren vars ändern möchten, müssen Sie sie in einen der Werte Clojure's refs einbinden. Sie könnten zum Beispiel atom verwenden:

(def state (atom {:currentPosition 1})) 

(reset! state {:currentPosition 2})  
@state ;; => {:currentPosition 2} 

(swap! state update :currentPosition inc) 
@state ;; => {:currentPosition 3} 
+0

cool, danke, werde jetzt versuchen – Ben

+0

hey Ich kann nicht testen, ob es funktioniert, wenn ich versuche zu tun: (nicht = (state: currentPosition) "2 ") es heißt Atom kann nicht nach IFn geworfen werden Irgendwelche Ideen? Nochmals vielen Dank – Ben

+0

Wenn Sie einen Wert von einem Atom lesen möchten, müssen Sie es "deref": '(deref currentPosition)'. Es gibt auch eine Kurzversion: '@ currentPosition' –

Verwandte Themen