Elixir - Modules

Dans Elixir, nous regroupons plusieurs fonctions en modules. Nous avons déjà utilisé différents modules dans les chapitres précédents tels que le module String, le module Bitwise, le module Tuple, etc.

Afin de créer nos propres modules dans Elixir, nous utilisons le defmodulemacro. Nous utilisons ledef macro pour définir les fonctions de ce module -

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

Dans les sections suivantes, nos exemples vont devenir plus longs et il peut être difficile de tous les saisir dans le shell. Nous devons apprendre à compiler du code Elixir et également à exécuter des scripts Elixir.

Compilation

Il est toujours pratique d'écrire des modules dans des fichiers afin qu'ils puissent être compilés et réutilisés. Supposons que nous ayons un fichier nommé math.ex avec le contenu suivant -

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

Nous pouvons compiler les fichiers en utilisant la commande -elixirc :

$ elixirc math.ex

Cela générera un fichier nommé Elixir.Math.beamcontenant le bytecode du module défini. Si nous commençonsiexencore une fois, notre définition de module sera disponible (à condition que iex soit démarré dans le même répertoire que le fichier bytecode). Par exemple,

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

Le programme ci-dessus générera le résultat suivant -

3

Mode scripté

En plus de l'extension de fichier Elixir .ex, Elixir prend également en charge .exsfichiers pour les scripts. Elixir traite les deux fichiers exactement de la même manière, la seule différence réside dans l'objectif..ex les fichiers sont destinés à être compilés tandis que les fichiers .exs sont utilisés pour scripting. Lorsqu'elles sont exécutées, les deux extensions compilent et chargent leurs modules en mémoire, bien que seulement.ex les fichiers écrivent leur bytecode sur le disque au format de fichiers .beam.

Par exemple, si nous voulions exécuter le Math.sum dans le même fichier, nous pouvons utiliser le .exs de la manière suivante -

Math.exs

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

Nous pouvons l'exécuter en utilisant la commande Elixir -

$ elixir math.exs

Le programme ci-dessus générera le résultat suivant -

3

Le fichier sera compilé en mémoire et exécuté, imprimant «3» comme résultat. Aucun fichier bytecode ne sera créé.

Imbrication de modules

Les modules peuvent être imbriqués dans Elixir. Cette fonctionnalité du langage nous aide à mieux organiser notre code. Pour créer des modules imbriqués, nous utilisons la syntaxe suivante -

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

L'exemple donné ci-dessus définira deux modules: Foo et Foo.Bar. Le second est accessible commeBar à l'intérieur Footant qu'ils sont dans la même portée lexicale. Si, plus tard, leBar module est déplacé en dehors de la définition du module Foo, il doit être référencé par son nom complet (Foo.Bar) ou un alias doit être défini en utilisant la directive alias décrite dans le chapitre alias.

Note- Dans Elixir, il n'est pas nécessaire de définir le module Foo pour définir le module Foo.Bar, car le langage traduit tous les noms de modules en atomes. Vous pouvez définir des modules imbriqués arbitrairement sans définir de module dans la chaîne. Par exemple, vous pouvez définirFoo.Bar.Baz sans définir Foo ou Foo.Bar.