Elixier - Typspezifikationen
Elixir ist eine dynamisch typisierte Sprache, sodass alle Typen in Elixir von der Laufzeit abgeleitet werden. Elixir wird jedoch mit Typenspezifikationen geliefert, für die eine Notation verwendet wirddeclaring custom data types and declaring typed function signatures (specifications).
Funktionsspezifikationen (Spezifikationen)
Standardmäßig bietet Elixir einige grundlegende Typen wie Integer oder PID sowie komplexe Typen: zum Beispiel die roundDie Funktion, die einen Gleitkommawert auf die nächste Ganzzahl rundet, nimmt eine Zahl als Argument (eine Ganzzahl oder einen Gleitkommawert) und gibt eine Ganzzahl zurück. In der zugehörigen Dokumentation wird die runde Signatur wie folgt geschrieben:
round(number) :: integer
Die obige Beschreibung impliziert, dass die Funktion auf der linken Seite als Argument verwendet, was in Klammern angegeben ist, und zurückgibt, was auf der rechten Seite von ::, dh Integer, steht. Funktionsspezifikationen werden mit dem geschrieben@specDirektive, direkt vor der Funktionsdefinition platziert. Die Rundungsfunktion kann geschrieben werden als -
@spec round(number) :: integer
def round(number), do: # Function implementation
...
Typenspezifikationen unterstützen auch komplexe Typen. Wenn Sie beispielsweise eine Liste von Ganzzahlen zurückgeben möchten, können Sie diese verwenden [Integer]
Benutzerdefinierte Typen
Elixir bietet zwar viele nützliche integrierte Typen, es ist jedoch praktisch, bei Bedarf benutzerdefinierte Typen zu definieren. Dies kann erfolgen, wenn Module über die @ type-Direktive definiert werden. Betrachten wir ein Beispiel, um dasselbe zu verstehen -
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)
Wenn das obige Programm ausgeführt wird, wird das folgende Ergebnis erzeugt:
30
You need a calculator to do that?
NOTE - Über @type definierte benutzerdefinierte Typen werden exportiert und sind außerhalb des Moduls verfügbar, in dem sie definiert sind. Wenn Sie einen benutzerdefinierten Typ privat halten möchten, können Sie das verwenden @typep Richtlinie statt @type.