0
votes

Ou comportement dans Elixir

J'ai la situation suivante une carte avec un faux code> propriété booléenne. Lorsque j'ai essayé d'affecter la valeur avec une condition ou code> à une autre carte, j'ai reçu un nil code> et non false code> comment je m'attendais.

iex(4)> if Map.has_key?(my_map, "email_sended"), do: my_map["email_sended"], else: my_map[:email_sended]
false


0 commentaires

4 Réponses :


1
votes

Si vous jetez un coup d'œil à ||, && et! documentation des opérateurs, vous pouvez trouver:

Toutes les valeurs sauf FAUX et NIL évalueront à TRUE: xxx

Cela signifie que || ne peut pas être utilisé de manière fiable pour de telles choses.

en général Votre approche est fausse, vous devez savoir avec quels types de clés que vous travaillez, car il y a des avantages / inconvénients à utiliser des clés atomes / chaînes.

Si vous voulez toujours faire ce travail, la meilleure approche serait de faire une aide Fonction: xxx

Cependant, ce n'est toujours pas parfait car la clé ATOM peut également être absente et que vous obtiendrez nil.


0 commentaires

1
votes

A (parfois considéré sale) Trick à convertir à propos de toute valeur à un booléen est le double non : xxx

mais sache que toute valeur autre que < code> nil ou false est considéré comme vrai, alors ne tombez pas dans ce piège: xxx

mais avant de commencer à utiliser ceci Cela pourrait être une bonne idée de supprimer l'incohérence de votre application concernant l'utilisation des clés de chaîne et d'atome pour la même information.


0 commentaires

0
votes

À mon humble avis, la manière la plus robuste serait d'utiliser map.get / 3 code> qui vérifie explicitement l'existence de la clé.

value = 
  Map.get(my_map, "email_sended",
    Map.get(my_map, :email_sended, {:error, :not_found}))
other_map = %{email_sended: value}
#⇒ %{email_sended: false}


0 commentaires

1
votes

Si vous recherchez simplement une solution intégrale courte, il suffit de le verser avec FALSE Will gérer le boîtier NIL:

iex> with :error <- Map.fetch(my_map, "email_sended"),
...>      :error <- Map.fetch(my_map, :email_sended) do
...>   false
...> else
...>   {:ok, sent} ->
...>     sent
...> end
false


0 commentaires