Estruturas
Estruturas em elixir
, são implementados igual Maps
. Os Maps
podem ser lidos e gravados com eficiência, são imutáveis e as chaves podem ser qualquer termo, como atoms
.
A estrutura é um map com uma chave já pré-definida chamada __struct__
. Vamos criar uma estrutura.
Você pode perceber, que ele já fala no próprio relatório de teste que User.__struct__/1
não existe. Esse campo __structure__
que define que um map
é uma struct
.
Claro, ainda não temos esse módulo e estrutura criados. Então vamos cria-los dentro do arquivo user.ex.
Para isso precisamos utilizar uma função em nosso módulo chamada defstruct, ela por natureza utiliza o nome do modulo como nome da estrutura, injetando dentro de __struct__
o nome completo do módulo, como o nosso so tem um nÃvel, será apenas User
Feito isso, basta rodar o teste e tudo funcionará.
Se Struct
na verdade é um map com uma chave __struct__
, porque eu deveria usar ela e não map
diretamente?
Diferente do Map, não podemos inserir valores na utilização da struct. Exemplo:
Ao rodar esse teste, irá gerar um relatório de erro de compilação acusando que field_does_not_exist_in_structure
não foi encontrado na estrutura User.__struct__/1
.
Esse comportamento é semelhante ao tentar adicionar algum valor a uma chave que não existe no map
:
A diferença entre os dois é que no map
temos um erro em tempo de execução (runtime) e na struct
temos um erro de compilação (compile-time).
Utilizamos estrutura para definir dados bem definidos, que já temos conhecimento de seus campos, como por exemplo User
, Article
e outros. Maps
são mais dinâmicos. Existem outras diferenças que veremos mais a frente.
Conclusão
Estruturas são tratados como Maps
e conseguimos ter um entendimento melhor assim. Porém temos algumas diferenças. Não podemos adicionar a nossa utilização de estrutura
um campo que não está definido nela, isso causará um erro de compilação.
Last updated