No hay forma directa de obtener el tipo de variable en Elixir / Erlang.
Por lo general, desea saber el tipo de una variable para actuar en consecuencia; puede usar las is_*
funciones para actuar según el tipo de una variable.
Learn You Some Erlang tiene un buen capítulo sobre cómo escribir en Erlang (y, por lo tanto, en Elixir).
La forma más idiomática de usar la is_*
familia de funciones probablemente sería usarlas en coincidencias de patrones:
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]]
, con códigoEnum.map(foo, fn(x) -> IO.puts x end)
porque [1,2, 3] se leerá como caracteres (¿por qué erlang!?), Y le mostrará un montón de caras sonrientes (¡pruébelo!). así que nos vemos obligados a usar la inspección aunque la inspección solo es necesaria si es una lista, de lo contrario la mayoría de las veces no la necesitamos. typeof nos permite convertir las declaraciones if (O (n)) en búsquedas de diccionario (O (1)).Printable
protocolo que envuelve y cambia el comportamiento de la impresión, por ejemplo, listas de enteros. Solo asegúrese de no usarlo con el código Erlang, o se rascará la cabeza preguntándose por qué en lugar de mensajes está viendo listas de enteros.Comenzando en elixir 1.2 hay un
i
comando en iex que enumerará el tipo y más de cualquier variable de Elixir.Si busca el
i
comando en el código , verá que se implementa mediante un protocolo.https://github.com/elixir-lang/elixir/blob/master/lib/iex/lib/iex/info.ex
Si desea implementar una función para cualquier tipo de Datos en Elixir, la forma de hacerlo es definir un Protocolo e implementar el Protocolo para todos los tipos de datos en los que desea que funcione la función. Desafortunadamente, no puedes usar una función de Protocolo en guardias. Sin embargo, un simple protocolo de "tipo" sería muy sencillo de implementar.
fuente
undefined function i/1
- lo mismo para el Info / 1&i/1
es una función deIEx.Helpers
. Si lo pones&IEx.Helpers.i/1
en tu vainilla Elixir, generarás un aCompileError
menos que lo hayas incluido:iex
como aplicación en tumix.exs
.También para fines de depuración, si no está en iex, puede llamarlo directamente:
fuente
Otro enfoque es utilizar la coincidencia de patrones. Digamos que estás usando Timex, que usa una
%DateTime{}
estructura, y quieres ver si un elemento es uno. Puede encontrar una coincidencia utilizando la coincidencia de patrones en el método.fuente
switch
/case
.Solo dejaré esto aquí por el bien de alguien que, con suerte, descubra una versión realmente sensata. Por el momento no hay buenas respuestas para esto en Google ...
En aras de la integridad, los casos de prueba:
Aquí hay una solución con protocolos; No estoy seguro de si son más rápidos (espero que no estén haciendo un bucle sobre todos los tipos), pero es bastante feo (y frágil; si agregan o eliminan un tipo básico o cambian el nombre, lo romperá).
fuente
Acabo de pegar el código de https://elixirforum.com/t/just-created-a-typeof-module/2583/5 :)
fuente
Me encontré con una situación que necesita verificar el parámetro debe ser cierto tipo. Quizás pueda activarse de una mejor manera.
Me gusta esto:
Uso:
fuente
Solo porque nadie lo ha mencionado
IO.inspect/1
Salidas para consolar el objeto ... es casi equivalente a JSON.stringify
Muy útil cuando simplemente no puede durante toda su vida descubrir cómo se ve un objeto en una prueba.
fuente