Ich lasse das hier nur für jemanden, hoffentlich herauszufinden, eine eigentlich gesunde Version. Im Moment gibt es keine guten Antworten auf diese auf Google kommen ...
defmodule Util do
def typeof(self) do
cond do
is_float(self) -> "float"
is_number(self) -> "number"
is_atom(self) -> "atom"
is_boolean(self) -> "boolean"
is_binary(self) -> "binary"
is_function(self) -> "function"
is_list(self) -> "list"
is_tuple(self) -> "tuple"
_ -> "idunno"
end
end
end
Aus Gründen der Vollständigkeit, Testfälle:
cases = [
1.337,
1337,
:'1337',
true,
<<1, 3, 3, 7>>,
(fn(x) -> x end),
{1, 3, 3, 7}
]
Enum.each cases, fn(case) ->
IO.puts (inspect case) <> " is a " <> (Util.typeof case)
end
Hier ist eine Lösung mit Protokollen; Ich bin mir nicht sicher, ob sie schneller sind (ich hoffe, dass sie keine Schleife über alle Typen machen), aber sie ist ziemlich hässlich (und zerbrechlich; wenn sie einen grundlegenden Typ hinzufügen oder entfernen oder umbenennen, wird es ihn brechen).
defprotocol Typeable, do: def typeof(self)
defimpl Typeable, for: Atom, do: def typeof(_), do: "Atom"
defimpl Typeable, for: BitString, do: def typeof(_), do: "BitString"
defimpl Typeable, for: Float, do: def typeof(_), do: "Float"
defimpl Typeable, for: Function, do: def typeof(_), do: "Function"
defimpl Typeable, for: Integer, do: def typeof(_), do: "Integer"
defimpl Typeable, for: List, do: def typeof(_), do: "List"
defimpl Typeable, for: Map, do: def typeof(_), do: "Map"
defimpl Typeable, for: PID, do: def typeof(_), do: "PID"
defimpl Typeable, for: Port, do: def typeof(_), do: "Port"
defimpl Typeable, for: Reference, do: def typeof(_), do: "Reference"
defimpl Typeable, for: Tuple, do: def typeof(_), do: "Tuple"
IO.puts Typeable.typeof "Hi"
IO.puts Typeable.typeof :ok
Hat Erlang/Elixir wirklich keine Typinformationen gespeichert haben? Muss ich wirklich einen ganz neuen Wrapper über existierende Typen erstellen, damit die Sprache verwendbar ist? O.o – Dmitry
@Dmitry was meinst du mit verwendbar? Kann ich ein konkretes Beispiel sehen, in dem Sie das Ergebnis von "typeof (variable)" verwenden würden? – whatyouhide
Wenn ein Programm die Kompilierzeit verlässt und die Laufzeit eingibt, sind alle Informationen darüber, was ein Objekt ist, verloren. Wenn ich Informationen eines laufenden Programms untersuchen möchte, kann ich nur durch die Inspektion von Dingen, die über ein Netzwerk von Karten verfügbar sind, wissen, was passiert. Wenn die Typinformationen nicht verfügbar sind und ich den Typ prüfen möchte, kostet es viel mehr, das Objekt zu analysieren, um seinen Typ zu erhalten, als wenn der Typ bereits verfügbar wäre. Mit typeof können wir das laufende System analysieren und zur Laufzeit so erweitern, dass Typchecking und Polymorphie möglich sind. – Dmitry