2016-04-05 12 views
44

Questo è apparentemente semplice, ma non riesco a trovarlo nei documenti. Devo semplicemente restituire true o false se un elemento esiste in un elenco o tupla. Enum.find/3 è davvero il modo migliore per farlo?Come verificare se un elemento esiste in un elenco di elisir o tupla?

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

Per un elenco ho potuto vedere dove si vuole vedere solo se l'articolo è là in cui Enum.member/2 sarebbe? essere un buono Ma per una tupla di solito ti interessa la posizione del valore, che è una delle bellezze delle tuple ... potresti prendere in considerazione l'uso di una tupla se non ti interessa la posizione – CaptChrisD

+0

Puoi segnare @ La risposta di Gazler come risposta accettata se è giusta. –

risposta

60

È possibile utilizzare Enum.member?/2

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

Con una tupla si vuole convertire in un elenco prima utilizzando Tuple.to_list/1

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

Grazie Gazler. La tua risposta è corretta, ma volevo pubblicare una risposta separata in base a tutti i suggerimenti che ho ricevuto in giro per la community. – ewH

+0

Nota che non sarai in grado di usare 'Enum.member?/2' all'interno di una guardia. In tal caso, dovrai fare affidamento su 'in'. Ad esempio: 'def foo (stringa) quando stringa in [" one "," two "], do: IO.puts (string)'. A proposito, questo è divertente, perché "in" è una macro che si traduce in "Enum.member?/2': D – Alessandro

22

Sulla base delle risposte qui e in Elixir Slack, ci sono diversi modi per verificare se un elemento esiste in un elenco. Per risposta da @Gazler:

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

o semplicemente

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

o

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

o se si desidera trovare e restituire l'articolo invece di true o false

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

Se si desidera controllare una tupla, è necessario convertire alla lista (@Gazler credito):

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

Ma, come @CaptChrisD sottolineato nei commenti, si tratta di una necessità raro per una tupla perché uno di solito si preoccupa della posizione esatta dell'articolo in una tupla per la corrispondenza del modello.

8

o semplicemente usare in:

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

È possibile utilizzare find_value troppo

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

ho iniziato la programmazione in Elixir ieri, ma cercherò qualcosa che ho fatto un sacco di JS, forse è utile quando la lista ha molti elementi e non vuoi attraversarlo tutto il tempo usando Enum.member?

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

È inoltre possibile recuperare un incrocio con qualche altro elenco:

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