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