Dans Elixir, comment vérifier le type comme en Python:
>>> a = "test"
>>> type(a)
<type 'str'>
>>> b =10
>>> type(b)
<type 'int'>
J'ai lu dans Elixir qu'il y avait des vérificateurs de type tels que 'is_bitstring', 'is_float', 'is_list', 'is_map' etc., mais que faire si vous n'avez aucune idée de ce que pourrait être le type?
typeof(variable)
?foo = [1, "hello", [1, 2, 3]]
, avec du codeEnum.map(foo, fn(x) -> IO.puts x end)
car [1,2, 3] sera lu comme des caractères (pourquoi erlang !!?), Et vous montrera un tas de visages souriants (essayez-le!). nous sommes donc obligés d'utiliser inspect même si inspect n'est nécessaire que s'il s'agit d'une liste, sinon la plupart du temps nous n'en avons pas besoin. typeof nous permet de transformer les instructions if (O (n)) en recherches dans le dictionnaire (O (1)).Printable
protocole qui encapsule et change le comportement de l'impression, par exemple des listes d'entiers. Assurez-vous simplement de ne pas l'utiliser avec le code Erlang - ou vous vous gratterez la tête en vous demandant pourquoi au lieu de messages, vous voyez des listes d'entiers.À partir de elixir 1.2, il y a une
i
commande dans iex qui listera le type et plus de n'importe quelle variable Elixir.Si vous regardez dans le code de la
i
commande, vous verrez que cela est implémenté via un protocole.https://github.com/elixir-lang/elixir/blob/master/lib/iex/lib/iex/info.ex
Si vous souhaitez implémenter une fonction pour n'importe quel type de données dans Elixir, la façon de le faire est de définir un protocole et l'implémentation du protocole pour tous les types de données sur lesquels vous souhaitez que la fonction fonctionne. Malheureusement, vous ne pouvez pas utiliser une fonction de protocole dans les gardes. Cependant, un protocole de "type" simple serait très simple à mettre en œuvre.
la source
undefined function i/1
- idem pour info / 1&i/1
est une fonction surIEx.Helpers
. Si vous le mettez&IEx.Helpers.i/1
dans votre élixir vanille, vous en générerez unCompileError
sauf si vous l'avez inclus:iex
comme application dans votre fichiermix.exs
.Aussi à des fins de débogage, si vous n'êtes pas dans iex, vous pouvez l'appeler directement:
la source
Une autre approche consiste à utiliser la correspondance de modèles. Supposons que vous utilisez Timex, qui utilise une
%DateTime{}
structure, et que vous voulez voir si un élément en est un. Vous pouvez trouver une correspondance en utilisant la correspondance de modèle dans la méthode.la source
switch
/case
.Je vais juste laisser ceci ici pour le bien de quelqu'un qui, espérons-le, trouvera une version réellement saine d'esprit. Pour le moment, il n'y a pas de bonnes réponses à cette question à venir sur Google ...
Par souci d'exhaustivité, les cas de test:
Voici une solution avec des protocoles; Je ne sais pas s'ils sont plus rapides (j'espère bien qu'ils ne font pas une boucle sur tous les types), mais c'est assez moche (et fragile; s'ils ajoutent ou suppriment un type de base ou le renomment, cela le cassera).
la source
Je viens de coller le code de https://elixirforum.com/t/just-created-a-typeof-module/2583/5 :)
la source
Je suis tombé sur une situation besoin de vérifier le paramètre doit être d'un certain type. Peut-être peut-être actif d'une meilleure façon.
Comme ça:
Usage:
la source
Juste parce que personne ne l'a mentionné
IO.inspect/1
Sorties pour consoler l'objet ... c'est presque équivalent à JSON.stringify
Très utile lorsque vous ne pouvez tout simplement pas pour la vie de vous comprendre à quoi ressemble un objet dans un test.
la source