Es gibt keine direkte Möglichkeit, den Typ einer Variablen in Elixir / Erlang abzurufen.
Normalerweise möchten Sie den Typ einer Variablen kennen, um entsprechend zu handeln. Sie können die is_*
Funktionen verwenden, um basierend auf dem Typ einer Variablen zu handeln.
Learn You Some Erlang hat ein schönes Kapitel über das Tippen in Erlang (und damit in Elixir).
Die idiomatischste Art, die is_*
Funktionsfamilie zu verwenden, besteht wahrscheinlich darin, sie in Musterübereinstimmungen zu verwenden:
def my_fun(arg) when is_map(arg), do: ...
def my_fun(arg) when is_list(arg), do: ...
def my_fun(arg) when is_integer(arg), do: ...
# ...and so on
typeof(variable)
?foo = [1, "hello", [1, 2, 3]]
mit Code zugeordnet werden,Enum.map(foo, fn(x) -> IO.puts x end)
da [1,2, 3] als Zeichen gelesen werden (warum erlang !!?) Und Ihnen ein paar lächelnde Gesichter zeigen (probieren Sie es aus!). Daher sind wir gezwungen, inspect zu verwenden, obwohl inspect nur benötigt wird, wenn es sich um eine Liste handelt. Andernfalls benötigen wir sie meistens nicht. Mit typeof können wir if-Anweisungen (O (n)) in Wörterbuchsuchen (O (1)) umwandeln.Printable
Protokoll implementieren , das das Druckverhalten umschließt und ändert, z. B. Listen von Ganzzahlen. Stellen Sie nur sicher, dass Sie es nicht mit Erlang-Code verwenden - oder Sie kratzen sich am Kopf und fragen sich, warum anstelle von Nachrichten Listen mit ganzen Zahlen angezeigt werden.Ab Elixir 1.2 gibt es
i
in iex einen Befehl, der den Typ und mehr aller Elixir-Variablen auflistet.Wenn Sie im Code nach dem
i
Befehl suchen, werden Sie feststellen, dass dies über ein Protokoll implementiert wird.https://github.com/elixir-lang/elixir/blob/master/lib/iex/lib/iex/info.ex
Wenn Sie eine Funktion für einen beliebigen Datentyp in Elixir implementieren möchten, müssen Sie dazu ein Protokoll definieren und das Protokoll für alle Datentypen implementieren, an denen die Funktion arbeiten soll. Leider können Sie in Guards keine Protokollfunktion verwenden. Ein einfaches "Typ" -Protokoll wäre jedoch sehr einfach zu implementieren.
quelle
undefined function i/1
- das gleiche gilt für info / 1&i/1
ist eine Funktion aufIEx.Helpers
. Wenn Sie es&IEx.Helpers.i/1
in Ihr Vanille-Elixier geben, generieren Sie ein, esCompileError
sei denn, Sie haben es:iex
als Anwendung in Ihr Vanix-Elixier aufgenommenmix.exs
.Wenn Sie sich nicht in iex befinden, können Sie es auch zu Debugging-Zwecken direkt aufrufen:
quelle
Ein anderer Ansatz ist die Verwendung des Mustervergleichs. Angenommen, Sie verwenden Timex, das eine
%DateTime{}
Struktur verwendet, und Sie möchten sehen, ob ein Element eines ist. Sie können eine Übereinstimmung mithilfe des Mustervergleichs in der Methode finden.quelle
switch
/case
.Ich lasse das hier, um jemanden zu finden, der hoffentlich eine wirklich vernünftige Version herausfindet. Im Moment gibt es keine guten Antworten auf diese Frage auf Google ...
Der Vollständigkeit halber Testfälle:
Hier ist eine Lösung mit Protokollen; Ich bin nicht sicher, ob sie schneller sind (ich hoffe, sie machen nicht eine Schleife über alle Typen), aber es ist ziemlich hässlich (und zerbrechlich; wenn sie einen Basistyp hinzufügen oder entfernen oder umbenennen, wird es ihn brechen).
quelle
Ich füge einfach den Code von https://elixirforum.com/t/just-created-a-typeof-module/2583/5 ein :)
quelle
Ich bin auf eine Situation gestoßen, in der überprüft werden muss, ob der Parameter ein bestimmter Typ sein muss. Vielleicht kann man besser aktiv werden.
So was:
Verwendung:
quelle
Nur weil es niemand erwähnt hat
IO.inspect/1
Ausgaben, um das Objekt zu trösten ... es entspricht fast JSON.stringify
Sehr hilfreich, wenn Sie für Ihr ganzes Leben nicht herausfinden können, wie ein Objekt in einem Test aussieht.
quelle