Elixir - Módulos
En Elixir, agrupamos varias funciones en módulos. Ya hemos utilizado diferentes módulos en los capítulos anteriores como el módulo String, módulo Bitwise, módulo Tuple, etc.
Para crear nuestros propios módulos en Elixir, usamos el defmodulemacro. Usamos eldef macro para definir funciones en ese módulo -
defmodule Math do
def sum(a, b) do
a + b
end
end
En las siguientes secciones, nuestros ejemplos aumentarán de tamaño y puede ser complicado escribirlos todos en el shell. Necesitamos aprender a compilar código Elixir y también a ejecutar scripts Elixir.
Compilacion
Siempre es conveniente escribir módulos en archivos para que puedan compilarse y reutilizarse. Supongamos que tenemos un archivo llamado math.ex con el siguiente contenido:
defmodule Math do
def sum(a, b) do
a + b
end
end
Podemos compilar los archivos usando el comando -elixirc :
$ elixirc math.ex
Esto generará un archivo llamado Elixir.Math.beamque contiene el bytecode para el módulo definido. Si empezamosiexnuevamente, nuestra definición de módulo estará disponible (siempre que iex se inicie en el mismo directorio en el que se encuentra el archivo de código de bytes). Por ejemplo,
IO.puts(Math.sum(1, 2))
El programa anterior generará el siguiente resultado:
3
Modo con guión
Además de la extensión de archivo Elixir .ex, Elixir también admite .exsarchivos para secuencias de comandos. Elixir trata ambos archivos exactamente de la misma manera, la única diferencia está en el objetivo..ex Los archivos están destinados a ser compilados, mientras que los archivos .exs se utilizan para scripting. Cuando se ejecutan, ambas extensiones compilan y cargan sus módulos en la memoria, aunque solo.ex los archivos escriben su código de bytes en el disco en el formato de archivos .beam.
Por ejemplo, si quisiéramos ejecutar el Math.sum en el mismo archivo, podemos usar los .exs de la siguiente manera:
Math.exs
defmodule Math do
def sum(a, b) do
a + b
end
end
IO.puts(Math.sum(1, 2))
Podemos ejecutarlo usando el comando Elixir -
$ elixir math.exs
El programa anterior generará el siguiente resultado:
3
El archivo se compilará en la memoria y se ejecutará, imprimiendo “3” como resultado. No se creará ningún archivo de código de bytes.
Anidamiento de módulos
Los módulos se pueden anidar en Elixir. Esta característica del lenguaje nos ayuda a organizar nuestro código de una mejor manera. Para crear módulos anidados, usamos la siguiente sintaxis:
defmodule Foo do
#Foo module code here
defmodule Bar do
#Bar module code here
end
end
El ejemplo dado anteriormente definirá dos módulos: Foo y Foo.Bar. Se puede acceder al segundo comoBar dentro Foosiempre que estén en el mismo ámbito léxico. Si, más tarde, elBar El módulo se mueve fuera de la definición del módulo Foo, debe ser referenciado por su nombre completo (Foo.Bar) o se debe establecer un alias usando la directiva de alias discutida en el capítulo de alias.
Note- En Elixir, no es necesario definir el módulo Foo para definir el módulo Foo.Bar, ya que el lenguaje traduce todos los nombres de los módulos a átomos. Puede definir módulos anidados arbitrariamente sin definir ningún módulo en la cadena. Por ejemplo, puede definirFoo.Bar.Baz sin definir Foo o Foo.Bar.