2012-06-11 15 views
5

मान लें कि मेरे पास एक गणनीय वस्तु enum है और अब मैं तीसरा आइटम प्राप्त करना चाहता हूं।निर्दिष्ट सूचकांक

मैं एक सामान्य दृष्टिकोण से एक को पता है एक सरणी में परिवर्तित और फिर जैसे सूचकांक के साथ का उपयोग:

enum.to_a[2] 

लेकिन इस तरह से एक अस्थायी सरणी पैदा करेगा और यह अक्षम हो सकता है।

अब मैं का उपयोग करें:

enum.each_with_index {|v, i| break v if i == 2} 

लेकिन यह काफी बदसूरत और अनावश्यक है।

ऐसा करने का सबसे प्रभावी तरीका क्या है?

उत्तर

5

आप take इस्तेमाल कर सकते हैं पहले तीन तत्वों से दूर छील करने के लिए और फिर last सरणी से तीसरा तत्व हड़पने के लिए कि take आप देता है:

third = enum.take(3).last 

आप सब पर किसी भी सरणियों उत्पन्न करने के लिए नहीं करना चाहते हैं तो शायद:

# If enum isn't an Enumerator then 'enum = enum.to_enum' or 'enum = enum.each' 
# to make it one. 
(3 - 1).times { enum.next } 
third = enum.next 
+0

यह बेहतर लग रहा है लेकिन, अगर मैं सूचकांक के रूप में एक बहुत बड़ी संख्या चाहते हैं, यह अभी भी इसके लिए एक बहुत बड़ी अस्थायी सरणी उत्पन्न होगा। –

+0

@ShouYa: जब आप टिप्पणी कर रहे थे तो मैंने एक और सरणी-कम विकल्प जोड़ा। आपको अभी भी एक-एक-एक करके 'enum' के माध्यम से टिकना होगा, लेकिन इसके बारे में आप कुछ भी नहीं कर सकते हैं (सामान्य रूप से)। –

+0

अगला का उपयोग करना एक स्मार्ट सुझाव है। मैं यह देखने के लिए उत्सुक होगा कि एक संग्रह को एक सरणी में परिवर्तित करने के लिए प्रदर्शन प्रभावों की तुलना किस प्रकार की जाती है। –

1

दुर्भाग्य से, यह एक सरणी के लिए परिवर्तित किया जाना है सूचकांक द्वारा एक सदस्य का उपयोग करने (अन्यथा आप पहली जगह में एक सूचकांक नहीं होती), तो आपके कोड पूरी तरह से मेरे लिए ठीक लग रहा है।

+0

उम, नहीं। यदि 'e' एक 'अंकक' है तो' 2. टाइम्स {e.next}' पहले दो मानों को दूर कर देगा और तीसरे 'e.next' को फेंक देगा, आपको कोई सरणी उत्पन्न किए बिना तीसरा व्यक्ति देगा। –

+0

@muistooshort हाँ, मैंने आपके धागे का जवाब दिया। और आप उस सम्मान में सही हैं। –

5

enumerable-lazy या रूबी 2.1 का उपयोग करके एमयू के उत्तर के लिए वैकल्पिक। लेकिन next का उपयोग कर के रूप में आलसी और अधिक कथात्मक के रूप में:

enum.lazy.drop(2).first 
संबंधित मुद्दे