2016-04-05 17 views
44

To pozornie proste, ale nie mogę znaleźć tego w dokumentach. Muszę po prostu zwrócić true lub false, jeśli element istnieje na liście lub krotce. Czy naprawdę najlepszym sposobem na to jest Enum.find/3?Jak sprawdzić, czy przedmiot istnieje na liście lub krotce eliksiru?

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

dla listy widziałem gdzie chcesz po prostu sprawdzić, czy element istnieje w którym Enum.member/2 będzie? bądź dobry. Ale dla krotki zazwyczaj dba się o pozycję wartości, to jest jedna z piękności krotek ... może warto rozważyć użycie krotki, jeśli nie interesuje cię pozycja – CaptChrisD

+0

Możesz chcieć oznaczyć @ Gazler odpowiedź jako zaakceptowana odpowiedź, jeśli to prawda. –

Odpowiedz

60

Można użyć Enum.member?/2

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

Z krotki będzie chcesz przekonwertować do listy pierwszym użyciem Tuple.to_list/1

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

Dzięki Gazler. Twoja odpowiedź jest poprawna, ale chciałem opublikować osobną odpowiedź na podstawie wszystkich sugestii, które otrzymałem w społeczności. – ewH

+0

Pamiętaj, że nie będziesz w stanie używać 'Enum.member?/2' wewnątrz strażnika. W takim przypadku będziesz musiał polegać na 'in'. Na przykład: 'def foo (string), gdy string w [" jeden "," dwa "], wykonaj: IO.puts (ciąg)'. Nawiasem mówiąc, to jest zabawne, ponieważ 'in' to makro, które tłumaczy się na' Enum.member?/2': D – Alessandro

22

podstawie odpowiedzi tutaj w Elixir Slack, istnieje wiele sposobów sprawdzenia, czy dany przedmiot istnieje na liście. za odpowiedź przez @Gazler:

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

lub po prostu

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

lub

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

lub jeśli chcesz znaleźć i zwrócić przedmiot zamiast true lub false

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

Jeśli chcesz sprawdzić krotki, trzeba konwertować do listy (@Gazler kredytowej):

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

Ale jak @CaptChrisD zauważył w komentarzach, jest to rzadkością potrzeba krotki bo zazwyczaj spotyka dba o dokładne położenie przedmiotu w krotce w celu dopasowania wzorca.

8

Albo po prostu użyć in:

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

Można użyć find_value zbyt

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 
2

zacząłem programowania w Elixir wczoraj, ale spróbuję coś zrobiłem wiele w JS, może to przydatne, gdy lista zawiera wiele elementów i nie chcesz jej przechodzić przez cały czas za pomocą Enum.member?

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

Można również pobrać skrzyżowanie z innej listy:

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