आप वस्तुओं की एक सरणी को फ़िल्टर करने के लिए रूबी में चयन विधि का उपयोग कर सकते हैं।
उदाहरण के लिए, आप सभी ढूंढ सकते हैं किसी सूची में सम संख्याएँ।
बिना select जो इस तरह दिखता है:
even_numbers = []
[1,2,3,4,5,6].each do |n|
if n.even?
even_numbers << n
end
end
even_numbers
इतना आसान कुछ के लिए यह थोड़ा सा कोड है!
आइए जानें कि कैसे उपयोग करें select ।
विधि उदाहरण चुनें
चयन का उपयोग करने के लिए एक ब्लॉक की आवश्यकता होती है।
ब्लॉक के अंदर, आपको कुछ ऐसा लौटाना होगा जो true . का मूल्यांकन करता है या false , और select इसका उपयोग आपकी सरणी को फ़िल्टर करने के लिए करेगा।
आप इस लेख को पढ़कर रूबी में बूलियन मूल्यों के बारे में जान सकते हैं।
यहां एक उदाहरण दिया गया है :
[1,2,3,4,5,6].select { |n| n.even? }
यह वही काम करेगा जो परिचय में पहला उदाहरण है, लेकिन बहुत कम कोड के साथ।
वास्तव में, हम इसे और भी कम कर सकते हैं।
इसे पसंद करें :
[1,2,3,4,5,6].select(&:even?)
इस प्रकार का शॉर्टकट केवल तभी काम करता है जब आपको किसी विधि को सीधे सरणी के प्रत्येक तत्व पर कॉल करना होता है।
बीटीडब्ल्यू, आप select . का भी उपयोग कर सकते हैं हैश के साथ।
उदाहरण :
stock = {
apples: 10,
oranges: 5,
bananas: 1
}
stock.select { |k, v| v > 1 }
# {:apples=>10, :oranges=>5}
जहां k कुंजी और v . का प्रतिनिधित्व करता है मूल्यों का प्रतिनिधित्व करते हैं।
मैं कह रहा हूं :
"मुझे 1 से अधिक स्टॉक वाले सभी फल खोजें"।
चयन को अन्य विधियों के साथ संयोजित करना
आप चयन विधि को किसी अन्य संख्यात्मक विधि के साथ जोड़ सकते हैं।
विशेष रूप से with_index ।
उदाहरण :
fruits = %w(apple orange banana)
fruits.select.with_index { |word, idx| idx.even? }
# ["apple", "banana"]
यह आपको ऑब्जेक्ट (इस मामले में एक स्ट्रिंग) के बजाय इंडेक्स का उपयोग करके फ़िल्टर करने की अनुमति देता है।
इन-प्लेस ऐरे फ़िल्टरिंग
select का उपयोग करना एक सरणी पर हमेशा एक नई सरणी बनाता है।
यदि इसके बजाय आप मूल सरणी को बदलना चाहते हैं, तो आप select! . का उपयोग कर सकते हैं विधि।
यहां बताया गया है :
fruits = %w(apple orange banana)
fruits.select! { |fruit| fruit.start_with? "a" }
# ["apple"]
विस्मयादिबोधक चिह्न के साथ समाप्त होने वाली विधियाँ (जैसे select! ) ऑब्जेक्ट को नया लौटाने के बजाय बदल देगा, लेकिन यह नियम स्वयं भाषा द्वारा लागू नहीं किया गया है।
यह हमारे बीच बस एक परंपरा है।
ढूंढें बनाम चुनें
जब आप किसी सूची को फ़िल्टर करना चाहते हैं और परिणामों के साथ एक सरणी प्राप्त करना चाहते हैं तो चयन बहुत अच्छा है।
लेकिन क्या होगा यदि आप केवल एक ही वस्तु खोजना चाहते हैं?
आप find . का उपयोग कर सकते हैं विधि।
इसे पसंद करें :
letters = %w(a aa aaa aaaa)
letters.find { |l| l.size == 3 }
# "aaa"
letters.find { |l| l.size == 10 }
# nil
Find आपको पहला मैच देता है, या nil अगर यह नहीं मिला।
सभी खोजें विधि को समझना
अगर आप find_all . के बारे में सोच रहे हैं विधि, और यह कैसे संबंधित है find &select ...
यह बहुत आसान है!
find_allविधिselect. के लिए एक उपनाम है ।findविधि आपको कई वस्तुओं के बजाय एक विशिष्ट वस्तु को खोजने में मदद करती है।
रूबी 2.6 select . के लिए एक और उपनाम जोड़ता है :
filter
चुनने के विपरीत क्या है?
आप जो तत्व नहीं चाहते हैं, उन्हें चुनने के बजाय आप उन्हें हटा सकते हैं।
चुनने से यह आसान है :
[1,2,3,4,5,6].select { |n| n != 4 }
लेकिन एक तरीका है जो चीजों को और स्पष्ट करता है।
वह तरीका है reject ।
उदाहरण :
[1,2,3,4,5,6].reject { |n| n == 4 }
प्रदर्शन या अन्यथा के संदर्भ में आपको कोई तकनीकी लाभ नहीं मिलता है, लेकिन यह आपके कोड को बेहतर बना देगा।
रेल चयन विधि
मैं नहीं चाहता कि जब आप रेल मॉडल के साथ काम करें तो आप भ्रमित न हों और सीखें कि आप select का भी उपयोग कर सकते हैं वहाँ।
आपको पता होना चाहिए कि...
यह select तरीका अलग है!
उदाहरण :
Fruit.select(:id, :name, :color)
जब आप select . का उपयोग करते हैं एक ActiveRecord . के साथ मॉडल आप डेटाबेस से विशिष्ट कॉलम मांग रहे हैं।
जहां तक मैं समझता हूं यह ज्यादातर प्रदर्शन कारणों से किया जाता है।
इस पर एक आखिरी नोट :
यदि आप रेल ऐप के अंदर नियमित सरणी के साथ काम कर रहे हैं तो आप select . का उपयोग कर रहे हैं इस पूरे लेख के दौरान हम जिस विधि के बारे में बात कर रहे हैं।
सारांश
आपने रूबी के सबसे उपयोगी तरीकों में से एक के बारे में सीखा है, जो सरणियों, श्रेणियों और हैश जैसी वस्तुओं के संग्रह के साथ काम करता है।

अब आपकी बारी है कि आप अपना संपादक खोलें और उसका उपयोग करें।
पढ़ने के लिए धन्यवाद!