C'est apparemment simple, mais je n'arrive pas à le trouver dans la documentation. Je dois simplement renvoyer true
ou false
si un élément existe dans une liste ou un tuple. Est Enum.find/3
vraiment le meilleur moyen de le faire?
Enum.find(["foo", "bar"], &(&1 == "foo")) != nil
Vous pouvez utiliser Enum.member?/2
Enum.member?(["foo", "bar"], "foo")
# true
Avec un tuple, vous voudrez d’abord convertir en une liste en utilisant Tuple.to_list/1
Tuple.to_list({"foo", "bar"})
# ["foo", "bar"]
Sur la base des réponses fournies ici et dans Elixir Slack, il existe plusieurs façons de vérifier si un élément existe dans une liste. Par réponse de @Gazler:
Enum.member?(["foo", "bar"], "foo")
# true
ou simplement
"foo" in ["foo", "bar"]
# true
ou
Enum.any?(["foo", "bar"], &(&1 == "foo")
# true
ou si vous souhaitez rechercher et renvoyer l'élément au lieu de true
ou false
Enum.find(["foo", "bar"], &(&1 == "foo")
# "foo"
Si vous voulez vérifier un tuple, vous devez convertir en liste (crédit @Gazler):
Tuple.to_list({"foo", "bar"})
# ["foo", "bar"]
Mais comme l'a souligné @CaptChrisD dans les commentaires, il s'agit d'un besoin inhabituel pour un tuple, car on se préoccupe généralement de la position exacte de l'élément dans un tuple pour la correspondance des modèles.
Ou utilisez simplement in
:
iex(1)> "foo" in ["foo", "bar"]
true
iex(2)> "foo" in Tuple.to_list({"foo", "bar"})
true
J'ai commencé à programmer dans Elixir hier, mais je vais essayer quelque chose que j'ai beaucoup fait dans JS. Peut-être que c'est utile lorsque la liste contient beaucoup d'éléments et que vous ne voulez pas la parcourir tout le temps en utilisant Enum.member?
map_existence = Enum.reduce(list,%{}, &(Map.put(&2,&1,true)))
map_existence[item_to_check]
Vous pouvez également récupérer une intersection avec une autre liste:
Enum.filter(some_other_list,&(map_existence[&1]))
Vous pouvez utiliser Enum.find_value/3
aussi:
iex(1)> Enum.find_value(["foo", "bar"],false, fn(x)-> x=="foo" end)
true
iex(2)> Enum.find_value(["foo", "bar"],false, fn(x)-> x=="food" end)
false