Ruby Array find_first object?


135

क्या मुझे ऐरे दस्तावेज में कुछ याद आ रहा है? मेरे पास एक सरणी है जिसमें एक वस्तु तक एक निश्चित मानदंड को संतुष्ट करना शामिल है। मैं कुशलतापूर्वक उस वस्तु को ढूंढना चाहता हूं। डॉक्स से मेरा सबसे अच्छा विचार यह है:

candidates = my_array.select { |e| e.satisfies_condition? }
found_it = candidates.first if !candidates.empty?

लेकिन मैं दो कारणों से असंतुष्ट हूं:

  1. इसने selectमुझे पूरी व्यूह रचना में उलझा दिया, भले ही हम पहली हिट के बाद जमानत ले सकते थे।
  2. मुझे उम्मीदवारों को समतल करने के लिए कोड की एक पंक्ति (एक शर्त के साथ) की आवश्यकता थी।

दोनों ऑपरेशन foreknowledge कि 0 या 1 संतोषजनक वस्तुओं के साथ बेकार हैं।

मुझे जो पसंद है वह कुछ इस तरह है:

array.find_first(block)

जो शून्य या उस पहली वस्तु को लौटाता है जिसके लिए ब्लॉक सही का मूल्यांकन करता है, उस वस्तु पर आघात को समाप्त करता है।

क्या मुझे यह स्वयं लिखना चाहिए? ऐरे में उन सभी अन्य महान तरीकों से मुझे लगता है कि यह वहां है और मैं इसे नहीं देख रहा हूं।

जवाबों:


201

या तो मैं आपके प्रश्न को समझ नहीं पा रहा हूं, या Enumerable # खोज वह चीज है जिसे आप ढूंढ रहे थे।


32
कोई बात नहीं, मुझे भी अक्सर गुस्सा आता है कि माणिक प्रलेखन सभी विरासतों या शामिल वर्गों और मॉड्यूल की विधियों को सूचीबद्ध नहीं करता है।
म्लाडेन जाबलानोविक

4
अधिक जानकारी: [1,2,3,5,2].find { |n| puts n; n == 2 } एक बार जब यह पहला तत्व मिल जाता है तो पुनरावृत्ति रुक ​​जाती है।
rajuGT

97

सरणी detectपद्धति का उपयोग करें यदि आप पहले मूल्य वापस करना चाहते हैं जहां ब्लॉक रिटर्न सही है

[1,2,3,11,34].detect(&:even?) #=> 2

OR

[1,2,3,11,34].detect{|i| i.even?} #=> 2

यदि आप उन सभी मूल्यों को वापस करना चाहते हैं जहां ब्लॉक सही है तो उपयोग करें select

[1,2,3,11,34].select(&:even?)  #=> [2, 34]

5
.detectवास्तव में मुझे क्या चाहिए लेकिन तब क्या अंतर है .find?
ऑगस्टिन रिडिन्गर

13
@AugustinRiedinger में कोई अंतर नहीं है, दोनों समान हैं। रूबी-doc.org/core-2.1.2/Enumerable.html#method-i-finddetectfind
Sandip Ransing

रूबी स्टाइल गाइड का पालन करने के लिए मुझे कुछ पसंद है , जिसके पक्षधर हैं
पॉल वैन लीउवेन

20

लगता है कि आपने डॉक्स में खोज विधि को याद किया:

my_array.find {|e| e.satisfies_condition? }

8
या यदि आपको कोड गोल्फिंग पसंद है, तोmy_array.find(&:satisfies_condition?)
एंड्रयू ग्रिम

14

आप वस्तु ही की जरूरत है या तुम सिर्फ अगर वहाँ जानने की आवश्यकता है क्या है कि संतुष्ट करता है एक वस्तु। यदि पूर्व हां तो: उपयोग खोजें:

found_object = my_array.find { |e| e.satisfies_condition? }

अन्यथा आप उपयोग कर सकते हैं any?

found_it = my_array.any?  { |e| e.satisfies_condition? }

उत्तरार्द्ध "सच" के साथ जमानत करेगा जब यह उस स्थिति को संतुष्ट करता है। पूर्व भी ऐसा ही करेगा, लेकिन वस्तु वापस कर देगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.