Clojure Hashmaps forklaret: Sådan henter du værdier fra og opdaterer Hashmaps

En hashmap er en samling, der kortlægger nøgler til værdier. De har forskellige navne på andre sprog - Python henviser til dem som ordbøger, og JavaScript-objekter fungerer stort set som hashmaps.

En hashmap kan, ligesom mange samlinger, konstrueres på to måder. Der er konstruktørfunktionen:

;; Note that each argument is *prepended* to the hashmap, not appended. (def a-hashmap (hash-map :a 1 :b 2 :c 3)) a-hashmap ; => {:c 3, :b 2, :a 1}

Du kan også definere dem ved hjælp af en hashmap-bogstavelig. Dette er ofte mere kortfattet og tydeligt. Det anbefales at bruge kommaer til at adskille nøgle- / værdipar i hashmaps, da det kan gøre grænserne mere klare.

;; This hashmap is actually in the right order, unlike the one above. (def another-hashmap {:a 1, :b 2, :c 3}) another-hashmap ; => {:a 1, :b 2, :c 3}

Hvornår skal man bruge en hashmap?

En hashmap er nyttig, når du vil give navne til dine variabler. Hvis du nogensinde tænker over for dig selv, "Hvad hvis jeg brugte et objekt ..." inden du klikker ud af det og indser, at du bruger Clojure, så prøv at bruge en hashmap.

De er også nyttige, hvis du vil knytte to forskellige værdier til hinanden. Tag for eksempel en ROT13-chiffer - du kan forbinde \Amed \N, \Bmed \Mog så videre.

Dette ville være lang og kedeligt at skrive på de fleste sprog, men Clojure har nogle funktioner, der kan generere det til dig og gøre det sjovt!

Nøgleord og hentning af værdier fra hashmaps

Hold op. Hvad er dette? :a? :b? :c? De ser underlige ud. Disse, ser du, er nøgleord. De kaldes nøgleord, fordi de ofte bruges som nøgler i hashmaps.

Hvorfor bruges de ofte som nøgler? I modsætning til strenge kan nøgleord bruges som funktioner til at udtrække værdier fra et hashmap; intet behov for geteller nth!

(def string-hashmap {"a" 1, "b" 2, "c" 3}) ("a" string-hashmap) ; => ClassCastException java.lang.String cannot be cast to clojure.lang.IFn (def keyword-hashmap {:a 1, :b 2, :c 3}) (:a keyword-hashmap) ; => 1 ;; You can also pass a keyword a default value in case it's not found, just like get. (:not-in-the-hashmap keyword-hashmap "not found!") ; => "not found!"

Opdater en hashmap

Du kan opdatere værdier inde i en hashmap ved hjælp af assoc. Dette giver dig mulighed for at tilføje nye nøgle / værdipar eller ændre gamle.

(def outdated-hashmap {:a 1, :b 2, :c 3}) (def newer-hashmap (assoc outdated-hashmap :d 4)) newer-hashmap ; => {:a 1, :b 2, :c 3, :d 4} (def newest-hashmap (assoc newer-hashmap :a 22)) newest-hashmap ; => {:a 22, :b 2, :c 3, :d 4} ;; Note that outdated-hashmap has not been mutated by any of this. ;; Assoc is pure and functional. outdated-hashmap ; => {:a 1, :b 2, :c 3}

Konvertering af andre samlinger til hashmaps

Det er vanskeligt at konvertere til et hashmap. Lad os prøve at bruge det som veceller for at demonstrere seq.

(hash-map [:a 1 :b 2 :c 3]) ; => IllegalArgumentException No value supplied for key: [:a 1 :b 2 :c 3]

Den hash-mapfunktion mener, at vi forsøger at skabe et HashMap med [:a 1 :b 2 :c 3]som en af nøglerne. Se hvad der sker, hvis vi giver det det rigtige antal argumenter:

(hash-map [:a 1 :b 2 :c 3] "foo") ; => {[:a 1 :b 2 :c 3] "foo"}

For at konvertere en sekvens til en hashmap skal du bruge og forstå apply. Heldigvis er dette ret simpelt: i det applyvæsentlige ødelægger en samling, før den anvender en funktion til den.

;; These two expressions are exactly the same. (+ 1 2 3) ; => 6 (apply + [1 2 3]) ; => 6

Sådan konverterer du en vektor til et hashmap:

(apply hash-map [:a 1 :b 2 :c 3]) ; => {:c 3, :b 2, :a 1} ;; This is the same as: (hash-map :a 1 :b 2 :c 3) ; => {:c 3, :b 2, :a 1}

Det skal være alt hvad du behøver for at komme i gang med hashmaps i Clojure. Gå nu derude og start hashing med det bedste fra dem.