Desestructuración de mapas en Clojure
Lee un mapa de pedido por clave y aplica la misma forma a un parámetro con valor por defecto.
;; {:keys [...]} pulls several keys out of a map in one binding form.
(def order {:sku "CB-14" :quantity 3 :unit-price 12.5})
(let [{:keys [sku quantity unit-price]} order]
(println (format "%s x%d = %.2f" sku quantity (* quantity unit-price))))
;; The same form works in a parameter list. :or supplies defaults for
;; keys the caller left out, and :as names the map that came in.
(defn describe-shipment
[{:keys [carrier service] :or {service "ground"} :as shipment}]
(format "%s by %s (%d fields)" carrier service (count shipment)))
(println (describe-shipment {:carrier "Pike Freight" :service "air"}))
(println (describe-shipment {:carrier "Pike Freight" :weight 40}))
Cómo funciona
(let [{:keys [sku quantity unit-price]} order]vincula tres claves de una, cada local con el nombre de su keyword.describe-shipmentdesestructura su parámetro ahí mismo, y:or {service "ground"}cubre lo que quien llama omitió.:as shipmentdeja vinculado el mapa entrante, así(count shipment)informa cuántas claves llegaron.
Palabras clave y builtins usados aquí
countdefdefnletprintln
El intento, en números
- Líneas
- 14
- Caracteres a escribir
- 675
- Tokens
- 97
- Ritmo de tres estrellas
- 65 tpm
Al ritmo de tres estrellas de 65 tokens por minuto, este intento toma unos 90 segundos.
Paso 2 de 3 en Desestructuración; paso 20 de 27 en Fundamentos del lenguaje.