# Imutabilidade

{% hint style="warning" %}
**Aviso sobre esse capítulo**

Abordarei apenas o básico para seguirmos nos estudos. Imutabilidade é um assunto complexo. Entender as vantagens e desvantagens pode consumir tempo e também confundir quem está começando em linguagens funcionais. Por hora, irei somente abordar o básico para entendimento da linguagem e para darmos continuidade nos estudos.
{% endhint %}

Como o próprio nome diz, imutabilidade significa imutável, algo constante, que não muda. Isso quer dizer, toda definição uma vez feita, nunca mudará. Para termos valores diferente, por exemplo, em uma variável, nós precisaremos sobrepor ela, jogando fora todo o valor antigo e adotando o novo valor.

Vamos a um exemplo simples:

* Criaremos um [`map`](/basico/colecoes/mapas.md) de user onde terá o atributo `name`&#x20;
* Alteraremos o `name` para `Cafe com elixir`

Vamos criar nosso teste para isso

<pre class="language-elixir" data-title="test/imutability_test.exs" data-line-numbers><code class="lang-elixir">defmodule ImmutabilityTest do
  use ExUnit.Case

  test "trying immutability" do
    user = %{name: "iago"}
<strong>    updated_user = %{user | name: "iago updated"}
</strong>
    assert user.name == "iago"
    assert updated_user.name == "iago updated"
  end
end
</code></pre>

```shell
mix test test/imutability_test.exs
.
Finished in 0.02 seconds (0.00s async, 0.02s sync)
1 test, 0 failures
```

**Duas coisas para notar aqui:**

1. Mesmo atualizando `user` para o novo nome, o valor de `user` não se alterou;&#x20;
2. Após a atualização, é retornado o valor atualizado do map. Esse novo valor nós adicionamos dentro de `updated_user` e essa variável tem a atualização do `user`.

Caso você queira continuar com a mesma variável, porém, com o novo valor, você vai precisar sobrepor o valor da variável anterior.

{% code title="" lineNumbers="true" %}

```elixir
defmodule ImmutabilityTest do
  use ExUnit.Case

  # ...
  test "override variable" do
    user = %{name: "iago"}
    user = %{user | name: "iago updated"}

    assert user.name == "iago updated"
  end
end
```

{% endcode %}

```shell
mix test test/imutability_test.exs
..
Finished in 0.02 seconds (0.00s async, 0.02s sync)
2 tests, 0 failures
```

Tudo no elixir é imutável, mantenha isso em mente é um conceito importante.

### Conclusão

Abordamos o básico de imutabilidade. É um ponto importante no estudo de linguagens funcionais. Ela nos ajuda a evitar diversos problemas na utilização da concorrência, nos dando uma boa vantagem em relações a linguagens mutáveis.

Lembrando, toda vez que realizarmos uma mudança de dados, o dado original nunca será alterado, você terá que cuidar dessa re-assinatura ou sobreposição de valores.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://aprenda.cafecomelixir.com.br/conceitos/imutabilidade.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
