Explicación de los Hashmaps de Clojure: Cómo recuperar valores de y actualizar Hashmaps

Un mapa hash es una colección que asigna claves a valores. Tienen varios nombres en otros lenguajes: Python se refiere a ellos como diccionarios, y los objetos de JavaScript funcionan esencialmente como hashmaps.

Un mapa de hash, como muchas colecciones, puede construirse de dos formas. Existe la función constructora:

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

También puede definirlos usando un literal hashmap. Suele ser más conciso y claro. Se recomienda usar comas para separar pares clave / valor en mapas hash, ya que puede aclarar los límites.

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

¿Cuándo usar un mapa hash?

Un mapa de hash es útil cuando desea dar nombres a sus variables. Si alguna vez piensas para ti mismo, "¿Qué pasa si utilizo un objeto ..." antes de que salgas de él y te des cuenta de que estás usando Clojure, intenta usar un mapa hash.

También son útiles si desea asociar dos valores diferentes entre sí. Tomemos, por ejemplo, un cifrado ROT13: podría asociarse \Acon \N, \Bcon \M, etc.

Esto sería largo y aburrido de escribir en la mayoría de los lenguajes, ¡pero Clojure tiene algunas funciones que pueden generarlo y hacerlo divertido!

Palabras clave y recuperación de valores de hashmaps

Sostener. ¿Que es esto? :a? :b? :c? Esos se ven raros. Esas, como ve, son palabras clave. Se llaman palabras clave porque a menudo se usan como claves en mapas hash.

¿Por qué se utilizan a menudo como llaves? Bueno, a diferencia de las cadenas, las palabras clave se pueden usar como funciones para extraer valores de un mapa hash; sin necesidad de geto 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!"

Actualizar un mapa de hash

Puede actualizar los valores dentro de un mapa hash usando assoc. Esto le permite agregar nuevos pares clave / valor o cambiar los antiguos.

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

Conversión de otras colecciones a hashmaps

Convertir a un mapa de hash es complicado. Para demostrarlo, intentemos usarlo como veco seq.

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

La hash-mapfunción cree que estamos tratando de crear un mapa hash con [:a 1 :b 2 :c 3]una de las claves. Mire lo que sucede si le damos la cantidad correcta de argumentos:

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

Para convertir una secuencia en un mapa hash, deberá usar y comprender apply. Afortunadamente, esto es bastante simple: applyesencialmente desestructura una colección antes de aplicarle una función.

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

Así es como convertirías un vector en un mapa hash:

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

Eso debería ser todo lo que necesita para comenzar con hashmaps en Clojure. Ahora sal y comienza a trabajar con los mejores.