Clojure Hashmaps paskaidrots: kā iegūt vērtības no un atjaunināt Hashmaps

Hashmap ir kolekcija, kurā tiek attēlotas vērtību atslēgas. Viņiem ir dažādi nosaukumi citās valodās - Python tos dēvē par vārdnīcām, un JavaScript objekti galvenokārt darbojas kā hashmaps.

Hashmap, tāpat kā daudzas kolekcijas, var veidot divējādi. Ir konstruktora funkcija:

;; 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}

Varat arī tos definēt, izmantojot hašmapa burtnīcu. Tas bieži ir kodolīgāk un skaidrāk. Ieteicams izmantot komatus, lai atslēgas / vērtības pārus atdalītu hashmaps, jo tas var padarīt robežas skaidrākas.

;; 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}

Kad lietot hashmap?

Hashmap ir noderīgs, ja vēlaties piešķirt nosaukumus mainīgajiem. Ja jūs kādreiz domājat: "Ko darīt, ja es izmantoju objektu ...", pirms jūs to izlauzāt un saprotat, ka izmantojat Clojure, mēģiniet izmantot hashmap.

Tie ir noderīgi arī tad, ja vēlaties savstarpēji saistīt divas dažādas vērtības. Veikt, piemēram, ROT13 šifru - jūs varētu saistīt \Aar \N, \Bar \Mutt.

Tas būtu ilgi un garlaicīgi rakstīt lielākajā daļā valodu, taču Clojure ir dažas funkcijas, kas to var ģenerēt jums un padarīt to jautru!

Atslēgvārdi un vērtību iegūšana no hashmaps

Aizturēt. Kas tas ir? :a? :b? :c? Tie izskatās dīvaini. Tie, jūs redzat, ir atslēgvārdi. Tos sauc par atslēgas atslēgas vārdiem, jo ​​tos bieži izmanto kā atslēgas hashmaps.

Kāpēc tos bieži izmanto kā atslēgas? Atšķirībā no virknēm atslēgvārdus var izmantot kā funkcijas, lai izvilktu vērtības no hashmap; nevajag getvai 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!"

Atjauniniet hashmap

Varat atjaunināt vērtības hashmap, izmantojot assoc. Tas ļauj pievienot jaunus atslēgu / vērtību pārus vai mainīt vecos.

(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}

Citu kolekciju pārveidošana par hashmaps

Konvertēšana uz hashmap ir grūts. Lai demonstrētu, mēģināsim to izmantot, piemēram, vecvai seq.

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

hash-mapFunkcija uzskata, ka mēs cenšamies radīt HashMap ar [:a 1 :b 2 :c 3]kā vienu no taustiņiem. Noskatieties, kas notiek, ja mēs tam dodam pareizo argumentu skaitu:

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

Lai pārveidotu secību par hashmap, jums būs jāizmanto un jāsaprot apply. Par laimi, tas ir diezgan vienkārši: applypirms funkcijas piemērošanas tai faktiski tiek sagrauta kolekcija.

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

Tādā veidā jūs pārveidotu vektoru par 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}

Tam vajadzētu būt visam, kas nepieciešams, lai sāktu darbu ar hashmaps Clojure. Tagad izejiet ārā un sāciet mocīties ar labākajiem.