freeCodeCamp/guide/portuguese/clojure/hashmaps/index.md

104 lines
4.7 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

---
title: Clojure Hashmaps
localeTitle: Clojure Hashmaps
---
Um hashmap é uma coleção que mapeia chaves para valores. Eles têm vários nomes em outros idiomas; O Python se refere a eles como dicionários, e os objetos JavaScript funcionam essencialmente como hashmaps.
Um hashmap pode, como muitas coleções, ser construído de duas maneiras. Existe a função construtora:
```
;; 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}
```
Você também pode defini-los usando um literal de hashmap. Isso geralmente é mais conciso e claro. É recomendável usar vírgulas para separar pares chave / valor em hashmaps, pois isso pode tornar os limites mais claros.
```
;; 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}
```
## Palavras-chave e recuperar valores de hashmaps
Aguarde. O que é isso? `:a` `:b` ? `:c` ? Aqueles parecem estranhos. Essas, você vê, são palavras-chave. Eles são chamados de palavras- _chave_ porque são usados com frequência como chaves em hashmaps.
Por que eles são freqüentemente usados como chaves? Bem, ao contrário das strings, as palavras-chave podem ser usadas como funções para extrair valores de um hashmap; Não há necessidade de `get` ou `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!"
```
## Convertendo outras coleções para hashmaps
A conversão para um hashmap é complicada. Para demonstrar, vamos tentar usá-lo como `vec` ou `seq` .
```
(hash-map [:a 1 :b 2 :c 3])
; => IllegalArgumentException No value supplied for key: [:a 1 :b 2 :c 3]
```
A função `hash-map` pensa que estamos tentando criar um hashmap com `[:a 1 :b 2 :c 3]` como uma das chaves. Veja o que acontece se dermos o número correto de argumentos:
```
(hash-map [:a 1 :b 2 :c 3] "foo")
; => {[:a 1 :b 2 :c 3] "foo"}
```
Para converter uma sequência em um hashmap, você precisará usar e entender `apply` . Felizmente, isso é bem simples: `apply` essencialmente uma coleção de destrutivos antes de aplicar uma função a ela.
```
;; These two expressions are exactly the same.
(+ 1 2 3)
; => 6
(apply + [1 2 3])
; => 6
```
É assim que você converteria um vetor em um 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}
```
![:rocket:](//forum.freecodecamp.com/images/emoji/emoji_one/rocket.png?v=2 ":foguete:") [IDEOne isso!](https://ideone.com/k9cOjo)
## Atualizar um hashmap
Você pode atualizar valores dentro de um hashmap usando `assoc` . Isso permite que você anexe novos pares de chave / valor ou altere os antigos.
```
(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}
```
## Quando usar um hashmap?
Um hashmap é útil quando você quer dar nomes às suas variáveis. Se você já pensou em si mesmo: _"E se eu usasse um objeto ..."_ antes de sair dessa e perceber que está usando o Clojure, tente usar um hashmap.
Eles também são úteis se você deseja associar dois valores diferentes entre si. Tomemos, por exemplo, uma cifra ROT13: você poderia associar `\A` com `\N` , `\B` com `\M` , etc. (Isso seria longo e chato de escrever na maioria das linguagens, mas o Clojure tem algumas funções que podem gerá-lo para você e torná-lo _divertido!_ )
| [![:point_left:](//forum.freecodecamp.com/images/emoji/emoji_one/point_left.png?v=2 ": point_left:") Anterior](//forum.freecodecamp.com/t/clojure-vectors/18421) | [![:book:](//forum.freecodecamp.com/images/emoji/emoji_one/book.png?v=2 ":livro:") Casa ![:book:](//forum.freecodecamp.com/images/emoji/emoji_one/book.png?v=2 ":livro:")](//forum.freecodecamp.com/t/clojure-resources/18422) | Próximo ![:point_right:](//forum.freecodecamp.com/images/emoji/emoji_one/point_right.png?v=2 ": point_right:") |
| [Vetores](//forum.freecodecamp.com/t/clojure-vectors/18421) | [Índice](//forum.freecodecamp.com/t/clojure-resources/18422) | Ser adicionado |