No Elixir, como você verifica tipos, como em Python:
>>> a = "test"
>>> type(a)
<type 'str'>
>>> b =10
>>> type(b)
<type 'int'>
Li no Elixir que existem verificadores de tipos como 'is_bitstring', 'is_float', 'is_list', 'is_map' etc.
Não existe uma maneira direta de obter o tipo de uma variável no Elixir / Erlang.
Você geralmente deseja saber o tipo de uma variável para agir em conformidade; você pode usar as is_*
funções para agir com base no tipo de uma variável.
Aprenda você Alguns Erlang tem um bom capítulo sobre como digitar Erlang (e, portanto, Elixir).
A maneira mais idiomática de usar a is_*
família de funções provavelmente seria usá-las em correspondências de padrões:
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]]
, com códigoEnum.map(foo, fn(x) -> IO.puts x end)
porque [1,2, 3] será lido como caracteres (por que erlang !!?) E mostrará um monte de rostos sorridentes (tente!). então somos forçados a usar a inspeção, mesmo que a inspeção seja necessária apenas se for uma lista; caso contrário, na maioria das vezes, não precisamos dela. typeof permite transformar as declarações if (O (n)) em pesquisas de dicionário (O (1)).Printable
protocolo que envolve e altera o comportamento da impressão, por exemplo, listas de números inteiros. Apenas certifique-se de não usá-lo com o código Erlang - ou você estará coçando a cabeça se perguntando por que, em vez de mensagens, está vendo listas de números inteiros.A partir do elixir 1.2, existe um
i
comando no iex que lista o tipo e mais de qualquer variável do Elixir.Se você procurar no código o
i
comando, verá que isso é implementado por meio de um protocolo.https://github.com/elixir-lang/elixir/blob/master/lib/iex/lib/iex/info.ex
Se você deseja implementar uma função para qualquer tipo de dados no Elixir, a maneira de fazer isso é definir um protocolo e a implementação do protocolo para todos os tipos de dados nos quais você deseja que a função trabalhe. Infelizmente, você não pode usar uma função de protocolo nos guardas. No entanto, um protocolo "tipo" simples seria muito simples de implementar.
fonte
undefined function i/1
- mesmo para info / 1&i/1
é uma função ativadaIEx.Helpers
. Se você colocar&IEx.Helpers.i/1
no seu Elixir de baunilha, você gerará um, aCompileError
menos que tenha incluído:iex
como aplicativo no seumix.exs
.Também para fins de depuração, se você não estiver no iex, pode chamá-lo diretamente:
fonte
Outra abordagem é usar a correspondência de padrões. Digamos que você esteja usando o Timex, que usa uma
%DateTime{}
estrutura, e deseja ver se um elemento é um. Você pode encontrar uma correspondência usando a correspondência de padrões no métodofonte
switch
/case
.Vou deixar isso aqui por causa de alguém, com sorte, descobrir uma versão realmente sã. No momento, não há boas respostas para isso chegando no google ...
Por uma questão de integridade, casos de teste:
Aqui está uma solução com protocolos; Não tenho certeza se eles são mais rápidos (espero que eles não estejam fazendo um loop em todos os tipos), mas é muito feio (e frágil; se eles adicionarem ou removerem um tipo básico ou renomearem, isso será interrompido).
fonte
Acabei de colar o código em https://elixirforum.com/t/just-created-a-typeof-module/2583/5 :)
fonte
Me deparei com uma situação precisa verificar o parâmetro precisa ser de determinado tipo. Talvez possa ativar uma maneira melhor.
Como isso:
Uso:
fonte
Só porque ninguém mencionou
IO.inspect/1
Saídas para consolar o objeto ... é quase equivalente ao JSON.stringify
Muito útil quando você simplesmente não consegue descobrir como é um objeto em um teste.
fonte