Elisir - Moduli
In Elixir, raggruppiamo diverse funzioni in moduli. Abbiamo già utilizzato diversi moduli nei capitoli precedenti come il modulo String, il modulo Bitwise, il modulo Tuple, ecc.
Per creare i nostri moduli in Elixir, usiamo il defmodulemacro. Noi usiamo ildef macro per definire le funzioni in quel modulo -
defmodule Math do
def sum(a, b) do
a + b
end
end
Nelle sezioni seguenti, i nostri esempi diventeranno più lunghi in termini di dimensioni e può essere difficile digitarli tutti nella shell. Dobbiamo imparare come compilare il codice Elixir e anche come eseguire gli script Elixir.
Compilazione
È sempre conveniente scrivere moduli in file in modo che possano essere compilati e riutilizzati. Supponiamo di avere un file chiamato math.ex con il seguente contenuto:
defmodule Math do
def sum(a, b) do
a + b
end
end
Possiamo compilare i file usando il comando -elixirc :
$ elixirc math.ex
Questo genererà un file denominato Elixir.Math.beamcontenente il bytecode per il modulo definito. Se iniziamoiexdi nuovo, sarà disponibile la definizione del nostro modulo (ammesso che iex sia avviato nella stessa directory in cui si trova il file bytecode). Per esempio,
IO.puts(Math.sum(1, 2))
Il programma sopra genererà il seguente risultato:
3
Modalità con script
Oltre all'estensione del file Elixir .ex, Elixir supporta anche .exsfile per lo scripting. Elixir tratta entrambi i file esattamente allo stesso modo, l'unica differenza è nell'obiettivo..ex i file sono pensati per essere compilati mentre i file .exs sono usati per scripting. Quando vengono eseguite, entrambe le estensioni compilano e caricano i propri moduli in memoria, anche se solo.ex i file scrivono il loro bytecode su disco nel formato dei file .beam.
Ad esempio, se volessimo eseguire il file Math.sum nello stesso file, possiamo usare il .exs nel modo seguente:
Math.exs
defmodule Math do
def sum(a, b) do
a + b
end
end
IO.puts(Math.sum(1, 2))
Possiamo eseguirlo usando il comando Elixir -
$ elixir math.exs
Il programma sopra genererà il seguente risultato:
3
Il file verrà compilato in memoria ed eseguito, stampando "3" come risultato. Non verrà creato alcun file bytecode.
Modulo Nesting
I moduli possono essere annidati in Elixir. Questa caratteristica del linguaggio ci aiuta a organizzare il nostro codice in un modo migliore. Per creare moduli annidati, usiamo la seguente sintassi:
defmodule Foo do
#Foo module code here
defmodule Bar do
#Bar module code here
end
end
L'esempio sopra riportato definirà due moduli: Foo e Foo.Bar. Il secondo è accessibile comeBar dentro Foofintanto che sono nello stesso ambito lessicale. Se, in seguito, il fileBar module viene spostato al di fuori della definizione del modulo Foo, deve essere referenziato con il suo nome completo (Foo.Bar) o un alias deve essere impostato utilizzando la direttiva alias discussa nel capitolo alias.
Note- In Elixir, non è necessario definire il modulo Foo per definire il modulo Foo.Bar, poiché la lingua traduce tutti i nomi dei moduli in atomi. È possibile definire moduli annidati arbitrariamente senza definire alcun modulo nella catena. Ad esempio, puoi definireFoo.Bar.Baz senza definire Foo o Foo.Bar.