Elixir - Caractéristiques types

Elixir est un langage typé dynamiquement, donc tous les types d'Elixir sont déduits par le runtime. Néanmoins, Elixir est livré avec des typespecs, qui sont une notation utilisée pourdeclaring custom data types and declaring typed function signatures (specifications).

Spécifications des fonctions (spécifications)

Par défaut, Elixir fournit des types de base, tels que des entiers ou des pid, ainsi que des types complexes: par exemple, le round, qui arrondit un flottant à son entier le plus proche, prend un nombre comme argument (un entier ou un flottant) et renvoie un entier. Dans la documentation associée , la signature dactylographiée ronde s'écrit -

round(number) :: integer

La description ci-dessus implique que la fonction à gauche prend comme argument ce qui est spécifié entre parenthèses et retourne ce qui est à droite de ::, c'est-à-dire Integer. Les spécifications de fonction sont écrites avec le@specdirective, placée juste avant la définition de la fonction. La fonction round peut s'écrire -

@spec round(number) :: integer
def round(number), do: # Function implementation
...

Les spécifications de type prennent également en charge les types complexes, par exemple, si vous souhaitez renvoyer une liste d'entiers, vous pouvez utiliser [Integer]

Types personnalisés

Bien qu'Elixir fournisse de nombreux types intégrés utiles, il est pratique de définir des types personnalisés le cas échéant. Cela peut être fait lors de la définition de modules via la directive @type. Prenons un exemple pour comprendre la même chose -

defmodule FunnyCalculator do
   @type number_with_joke :: {number, String.t}

   @spec add(number, number) :: number_with_joke
   def add(x, y), do: {x + y, "You need a calculator to do that?"}

   @spec multiply(number, number) :: number_with_joke
   def multiply(x, y), do: {x * y, "It is like addition on steroids."}
end

{result, comment} = FunnyCalculator.add(10, 20)
IO.puts(result)
IO.puts(comment)

Lorsque le programme ci-dessus est exécuté, il produit le résultat suivant -

30
You need a calculator to do that?

NOTE - Les types personnalisés définis via @type sont exportés et disponibles en dehors du module dans lequel ils sont définis. Si vous souhaitez conserver un type personnalisé privé, vous pouvez utiliser le @typep directive au lieu de @type.