Clojure Hashmaps magyarázata: Hogyan lehet lekérdezni az értékeket és frissíteni a Hashmaps-ot

A hashmap olyan gyűjtemény, amely a kulcsokat feltérképezi az értékekhez. Különböző nevekkel rendelkeznek más nyelveken - a Python szótárakként emlegeti őket, és a JavaScript objektumai lényegében hashapként működnek.

A hashmap, mint sok gyűjtemény, kétféleképpen is felépíthető. Van a konstruktor függvény:

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

Meghatározhatja őket egy hashmap literál használatával is. Ez gyakran tömörebb és egyértelműbb. Vesszők használata ajánlott a kulcs / érték párok elkülönítéséhez a hashmaps-ban, mivel ez világosabbá teheti a határokat.

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

Mikor kell használni a hashmap-ot?

A hashmap akkor hasznos, ha neveket akar adni a változóknak. Ha valaha azt gondolja magában: "Mi lenne, ha egy tárgyat használnék ...", mielőtt kipattanna belőle és rájönne, hogy a Clojure-t használja, próbáljon meg egy hashmapot használni.

Akkor is hasznosak, ha két különböző értéket akar társítani egymáshoz. Vegyük például egy ROT13 titkosító - tudna társítani \Aa \N, \Ba \M, és így tovább.

Ezt hosszú és unalmas lenne a legtöbb nyelvre írni, de a Clojure rendelkezik néhány olyan funkcióval, amelyek előállíthatják és szórakoztatóvá tehetik !

Kulcsszavak és értékek lekérése a hashmaps-ból

Várj. Mi ez? :a? :b? :c? Azok furcsának tűnnek. Ezek, látja, kulcsszavak. Ők az úgynevezett kulcs -Words, mert ők gyakran használják a kulcsokat hashmaps.

Miért használják őket gyakran kulcsként? Nos, a karakterláncokkal ellentétben a kulcsszavak funkcióként használhatók az értékek kibontására egy hashmap-ból; nem kell getvagy 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!"

Frissítsen egy hashmap-ot

A hashmap használatával frissítheti az értékeket assoc. Ez lehetővé teszi új kulcs / érték párok hozzáfűzését vagy a régiek megváltoztatását.

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

Más gyűjtemények konvertálása hashmapokká

A hashmap-ba konvertálás bonyolult. A bemutatáshoz próbáljuk meg használni, mint a vecvagy a seq.

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

A hash-mapfüggvény úgy gondolja, hogy egy hashmap-ot próbálunk létrehozni [:a 1 :b 2 :c 3]az egyik kulccsal. Figyelje, mi történik, ha megfelelő számú érvet adunk neki:

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

Ahhoz, hogy egy szekvenciát hashmap-vá alakítson, használnia és megértenie kell apply. Szerencsére ez nagyon egyszerű: applylényegében megsemmisíti a gyűjteményt, mielőtt egy funkciót alkalmazna rá.

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

Így konvertálhat egy vektort hashmap-ba:

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

Ez minden, amire szükséged van a hasmaps használatához a Clojure-ban. Most menj ki, és kezdd el keveredni a legjobbakkal.