Elixir - Módulos

No Elixir, agrupamos várias funções em módulos. Já usamos diferentes módulos nos capítulos anteriores, como o módulo String, módulo Bitwise, módulo Tuple, etc.

Para criar nossos próprios módulos no Elixir, usamos o defmodulemacro. Nós usamos odef macro para definir funções nesse módulo -

defmodule Math do
   def sum(a, b) do
      a + b
   end
end

Nas seções a seguir, nossos exemplos ficarão maiores e pode ser complicado digitá-los todos no shell. Precisamos aprender como compilar o código Elixir e também como executar scripts Elixir.

Compilação

É sempre conveniente escrever módulos em arquivos para que possam ser compilados e reutilizados. Vamos supor que temos um arquivo chamado math.ex com o seguinte conteúdo -

defmodule Math do
   def sum(a, b) do
      a + b
   end
end

Podemos compilar os arquivos usando o comando -elixirc :

$ elixirc math.ex

Isso irá gerar um arquivo chamado Elixir.Math.beamcontendo o bytecode para o módulo definido. Se começarmosiexnovamente, nossa definição de módulo estará disponível (desde que iex seja iniciado no mesmo diretório em que o arquivo de bytecode está). Por exemplo,

IO.puts(Math.sum(1, 2))

O programa acima irá gerar o seguinte resultado -

3

Modo de script

Além da extensão do arquivo Elixir .ex, Elixir também suporta .exsarquivos para script. O Elixir trata os dois arquivos exatamente da mesma forma, a única diferença está no objetivo..ex os arquivos devem ser compilados enquanto os arquivos .exs são usados ​​para scripting. Quando executado, ambas as extensões compilam e carregam seus módulos na memória, embora apenas.ex os arquivos gravam seu bytecode no disco no formato de arquivos .beam.

Por exemplo, se quisermos executar o Math.sum no mesmo arquivo, podemos usar os .exs da seguinte maneira -

Math.exs

defmodule Math do
   def sum(a, b) do
      a + b
   end
end
IO.puts(Math.sum(1, 2))

Podemos executá-lo usando o comando Elixir -

$ elixir math.exs

O programa acima irá gerar o seguinte resultado -

3

O arquivo será compilado na memória e executado, imprimindo “3” como resultado. Nenhum arquivo bytecode será criado.

Módulo Aninhado

Os módulos podem ser aninhados no Elixir. Esse recurso da linguagem nos ajuda a organizar nosso código de uma maneira melhor. Para criar módulos aninhados, usamos a seguinte sintaxe -

defmodule Foo do
   #Foo module code here
   defmodule Bar do
      #Bar module code here
   end
end

O exemplo fornecido acima definirá dois módulos: Foo e Foo.Bar. O segundo pode ser acessado comoBar dentro Foocontanto que estejam no mesmo escopo léxico. Se, mais tarde, oBar módulo é movido para fora da definição do módulo Foo, ele deve ser referenciado por seu nome completo (Foo.Bar) ou um alias deve ser definido usando a diretiva alias discutida no capítulo de alias.

Note- No Elixir, não há necessidade de definir o módulo Foo para definir o módulo Foo.Bar, já que a linguagem traduz todos os nomes dos módulos em átomos. Você pode definir módulos aninhados arbitrariamente sem definir nenhum módulo na cadeia. Por exemplo, você pode definirFoo.Bar.Baz sem definir Foo ou Foo.Bar.