Clojure Hashmaps Επεξήγηση: Πώς να ανακτήσετε τιμές από και να ενημερώσετε Hashmaps

Το hashmap είναι μια συλλογή που χαρτογραφεί κλειδιά σε τιμές. Έχουν διάφορα ονόματα σε άλλες γλώσσες - η Python τους αναφέρεται ως λεξικά και τα αντικείμενα της JavaScript λειτουργούν ουσιαστικά σαν hashmaps.

Ένα hashmap μπορεί, όπως πολλές συλλογές, να κατασκευαστεί με δύο τρόπους. Υπάρχει η συνάρτηση κατασκευαστή:

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

Μπορείτε επίσης να τα ορίσετε χρησιμοποιώντας μια λέξη-κλειδί κατακερματισμού. Αυτό είναι συχνά πιο περιεκτικό και σαφές. Συνιστάται η χρήση κόμματα για το διαχωρισμό ζευγών κλειδιών / τιμών σε κατακερματισμούς, καθώς μπορεί να κάνει τα όρια πιο ξεκάθαρα.

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

Πότε να χρησιμοποιήσετε έναν κατακερματισμό;

Ένα hashmap είναι χρήσιμο όταν θέλετε να δώσετε ονόματα στις μεταβλητές σας. Εάν σκέφτεστε ποτέ τον εαυτό σας, "Τι γίνεται αν χρησιμοποιούσα ένα αντικείμενο ..." πριν βγείτε από αυτό και συνειδητοποιήσετε ότι χρησιμοποιείτε το Clojure, δοκιμάστε να χρησιμοποιήσετε ένα κατακερματισμό.

Είναι επίσης χρήσιμα εάν θέλετε να συσχετίσετε δύο διαφορετικές τιμές μεταξύ τους. Πάρτε, για παράδειγμα, μια κρυπτογράφηση ROT13 - θα μπορούσατε να συσχετίσετε \Aμε \N, \Bμε \Mκαι ούτω καθεξής.

Αυτό θα ήταν μακρύ και βαρετό να γράφεται στις περισσότερες γλώσσες, αλλά το Clojure έχει κάποιες λειτουργίες που μπορούν να το δημιουργήσουν για εσάς και να το κάνουν διασκεδαστικό!

Λέξεις-κλειδιά και τιμές ανάκτησης από κατακερματισμούς

Καθυστερώ. Τι είναι αυτό? :a; :b; :c; Αυτά φαίνονται περίεργα. Αυτές, βλέπετε, είναι λέξεις-κλειδιά. Ονομάζονται λέξεις- κλειδιά επειδή χρησιμοποιούνται συχνά ως κλειδιά σε κατακερματισμούς.

Γιατί χρησιμοποιούνται συχνά ως κλειδιά; Λοιπόν, σε αντίθεση με τις συμβολοσειρές, οι λέξεις-κλειδιά μπορούν να χρησιμοποιηθούν ως συναρτήσεις για την εξαγωγή τιμών από έναν κατακερματισμό. δεν χρειάζεται για getή 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!"

Ενημέρωση κατακερματισμού

Μπορείτε να ενημερώσετε τιμές μέσα σε έναν κατακερματισμό χρησιμοποιώντας assoc. Αυτό σας επιτρέπει να προσθέσετε νέα ζεύγη κλειδιών / τιμών ή να αλλάξετε παλιά.

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

Μετατροπή άλλων συλλογών σε κατακερματισμούς

Η μετατροπή σε κατακερματισμό είναι δύσκολη. Για να το δείξουμε, ας το χρησιμοποιήσουμε σαν vecή seq.

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

Η hash-mapσυνάρτηση πιστεύει ότι προσπαθούμε να δημιουργήσουμε έναν κατακερματισμό με [:a 1 :b 2 :c 3]ένα από τα πλήκτρα. Παρακολουθήστε τι συμβαίνει εάν του δώσουμε τον σωστό αριθμό επιχειρημάτων:

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

Για να μετατρέψετε μια ακολουθία σε κατακερματισμό, θα πρέπει να χρησιμοποιήσετε και να κατανοήσετε apply. Ευτυχώς, αυτό είναι πολύ απλό: applyουσιαστικά καταστρέφει μια συλλογή πριν εφαρμόσει μια συνάρτηση σε αυτήν.

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

Με αυτόν τον τρόπο θα μετατρέπατε ένα διάνυσμα σε ένα κατακερματισμό:

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

Αυτό πρέπει να είναι ό, τι χρειάζεστε για να ξεκινήσετε με κατακερματισμούς στο Clojure. Τώρα βγείτε εκεί και αρχίστε να κατακερματίζεστε με τα καλύτερα.