2016-04-05 5 views
44

यह प्रतीत होता है सरल है, लेकिन मुझे दस्तावेज़ों में यह प्रतीत नहीं होता है। यदि कोई सूची किसी सूची या टुपल में मौजूद है तो मुझे बस true या false वापस करने की आवश्यकता है। Enum.find/3 वास्तव में ऐसा करने का सबसे अच्छा तरीका है?कैसे जांचें कि कोई आइटम किसी एलीक्सिर सूची या टुपल में मौजूद है या नहीं?

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

सूची के लिए मैं देख सकता है जहाँ आप सिर्फ आइटम आप देखना चाहते हैं वहाँ जिसमें Enum.member/2 होता है अच्छे बनो। लेकिन एक ट्यूपल के लिए आप आमतौर पर मूल्य की स्थिति की परवाह करते हैं, जो टुपल्स की सुंदरियों में से एक है ... यदि आप – CaptChrisD

+0

स्थिति की परवाह नहीं करते हैं तो आप टुपल के उपयोग पर विचार करना चाहेंगे @ गज़लर का उत्तर स्वीकार्य उत्तर के रूप में अगर यह सही है। –

उत्तर

60

आप उपयोग कर सकते हैं एक टपल साथ Enum.member?/2

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

आप के लिए कनवर्ट करना चाहते हैं जाएगा एक सूची पहले का उपयोग करने के Tuple.to_list/1

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

धन्यवाद गैज़लर। आपका उत्तर सही है, लेकिन मैं समुदाय के आसपास प्राप्त सभी सुझावों के आधार पर एक अलग उत्तर पोस्ट करना चाहता था। – ewH

+0

ध्यान दें कि आप एक गार्ड के अंदर 'Enum.member?/2' का उपयोग करने में सक्षम नहीं होंगे। उस स्थिति में, आपको 'इन' पर भरोसा करना होगा। उदाहरण के लिए: [def "(" दो "] में स्ट्रिंग करते समय 'def foo (string), करें: IO.puts (string)'। वैसे, यह मजाकिया है, क्योंकि 'इन' एक मैक्रो है जो' Enum.member '/ 2' में अनुवाद करता है: डी – Alessandro

22

जवाब यहां पर और अमृत स्लैक में आधार पर, सूची में कोई आइटम मौजूद है या नहीं, यह जांचने के कई तरीके हैं। प्रति जवाब @Gazler द्वारा:

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

या बस

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

या

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

या आप पाते हैं और true या false

Enum.find(["foo", "bar"], &(&1 == "foo") 
# "foo" 
के बजाय आइटम वापस करना चाहते हैं

आप एक टपल की जांच करना चाहते हैं, तो आप (क्रेडिट @Gazler) सूची में बदलने की आवश्यकता:

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

लेकिन जैसे @CaptChrisD टिप्पणी में कहा, यह एक टपल के लिए एक असामान्य जरूरत है, क्योंकि आम तौर पर पैटर्न मिलान के लिए एक tuple में आइटम की सटीक स्थिति के बारे में परवाह करता है।

8

या बस in का उपयोग करें:

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

आप उपयोग कर सकते हैं find_value भी

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

मैं प्रोग्रामिंग अमृत में कल शुरू कर दिया है, लेकिन मुझे लगता है मैं जे एस में एक बहुत कुछ किया कुछ की कोशिश करेंगे, शायद यह है उपयोगी है जब सूची में बहुत से तत्व हैं और आप Enum.member का उपयोग करके हर समय इसे पार नहीं करना चाहते हैं?

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

तुम भी कुछ अन्य सूची के साथ एक चौराहे प्राप्त कर सकते हैं:

Enum.filter(some_other_list,&(map_existence[&1])) 
संबंधित मुद्दे