Elisir - Tipologie
Elixir è un linguaggio tipizzato dinamicamente, quindi tutti i tipi in Elixir vengono dedotti dal runtime. Tuttavia, Elixir viene fornito con typespec, che sono una notazione utilizzata perdeclaring custom data types and declaring typed function signatures (specifications).
Specifiche di funzione (specifiche)
Per impostazione predefinita, Elixir fornisce alcuni tipi di base, come interi o pid, e anche tipi complessi: ad esempio, il roundfunzione, che arrotonda un float al numero intero più vicino, accetta un numero come argomento (un intero o un float) e restituisce un numero intero. Nella relativa documentazione , la firma tonda dattiloscritta è scritta come:
round(number) :: integer
La descrizione precedente implica che la funzione a sinistra prende come argomento ciò che è specificato tra parentesi e restituisce ciò che è a destra di ::, cioè, Integer. Le specifiche della funzione sono scritte con l'estensione@specdirettiva, posta subito prima della definizione della funzione. La funzione round può essere scritta come -
@spec round(number) :: integer
def round(number), do: # Function implementation
...
Typespecs supporta anche tipi complessi, ad esempio, se vuoi restituire un elenco di numeri interi, puoi usare [Integer]
Tipi personalizzati
Sebbene Elixir fornisca molti utili tipi integrati, è conveniente definire tipi personalizzati quando appropriato. Questo può essere fatto quando si definiscono i moduli tramite la direttiva @type. Consideriamo un esempio per capire lo stesso:
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)
Quando il programma di cui sopra viene eseguito, produce il seguente risultato:
30
You need a calculator to do that?
NOTE - I tipi personalizzati definiti tramite @type vengono esportati e disponibili all'esterno del modulo in cui sono definiti. Se si desidera mantenere privato un tipo personalizzato, è possibile utilizzare il @typep direttiva invece di @type.