elixir

¿Cómo verificar si un elemento existe en una lista o tupla de Elixir?



(5)

Esto es aparentemente simple, pero parece que no puedo encontrarlo en los documentos. Simplemente necesito devolver true o false si existe un elemento en una lista o tupla. ¿Es Enum.find/3 realmente la mejor manera de hacer esto?

Enum.find(["foo", "bar"], &(&1 == "foo")) != nil


Empecé a programar en Elixir ayer, pero intentaré algo que hice mucho en JS, ¿tal vez sea útil cuando la lista tiene muchos elementos y no quieres recorrerla todo el tiempo usando Enum.member?

map_existence = Enum.reduce(list,%{}, &(Map.put(&2,&1,true))) map_existence[item_to_check]

También puede recuperar una intersección con alguna otra lista:

Enum.filter(some_other_list,&(map_existence[&1]))


O simplemente usar in :

iex(1)> "foo" in ["foo", "bar"] true iex(2)> "foo" in Tuple.to_list({"foo", "bar"}) true


Puedes usar Enum.member?/2

Enum.member?(["foo", "bar"], "foo") # true

Con una tupla, primero querrá convertir a una lista usando Tuple.to_list/1

Tuple.to_list({"foo", "bar"}) # ["foo", "bar"]


Según las respuestas aquí y en Elixir Slack, hay varias formas de verificar si un elemento existe en una lista. Por respuesta de @Gazler:

Enum.member?(["foo", "bar"], "foo") # true

o simplemente

"foo" in ["foo", "bar"] # true

o

Enum.any?(["foo", "bar"], &(&1 == "foo") # true

o si desea encontrar y devolver el artículo en lugar de true o false

Enum.find(["foo", "bar"], &(&1 == "foo") # "foo"

Si desea verificar una tupla, debe convertirla a la lista (crédito @Gazler):

Tuple.to_list({"foo", "bar"}) # ["foo", "bar"]

Pero como @CaptChrisD señaló en los comentarios, esta es una necesidad poco común de una tupla porque a uno generalmente le importa la posición exacta del elemento en una tupla para la coincidencia de patrones.


También puede usar Enum.find_value/3 :

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