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
4 Réponses :
Si vous jetez un coup d'œil à Toutes les valeurs sauf FAUX et NIL évalueront à TRUE: P>
blockquote> Cela signifie que 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. P> Si vous voulez toujours faire ce travail, la meilleure approche serait de faire une aide Fonction: p> Cependant, ce n'est toujours pas parfait car la clé ATOM peut également être absente et que vous obtiendrez nil. P> P> ||, && et! code> documentation des opérateurs, vous pouvez trouver:
|| code> ne peut pas être utilisé de manière fiable pour de telles choses. P>
A (parfois considéré sale) Trick à convertir à propos de toute valeur à un booléen est le double non em>: mais sache que toute valeur autre que < code> nil code> ou 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. P> P> false code> est considéré comme vrai, alors ne tombez pas dans ce piège: p>
À 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}
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