Ruby में प्रत्येक .with_index और प्रत्येक_with_index के बीच अंतर?


94

मैं वास्तव में each.with_indexऔर के बीच के अंतर के बारे में उलझन में हूँ each_with_index। उनके पास विभिन्न प्रकार हैं लेकिन व्यवहार में समान प्रतीत होते हैं।


6
मामूली अंतर यह है कि एक तरफ with_indexएक शुरू करने सूचकांक ऑफसेट परमिट, with_indexआम तौर पर जब साथ संयोजन के रूप में प्रयोग किया जाता पसंद किया जाता है map, reduce, collect, आदि संक्षेप में, map.with_indexकी तुलना में बेहतर पढ़ता है each_with_index.map। एक अर्थ में, जब इसका उपयोग किया जाता है map, तो यह गैर-मौजूद map_with_indexपद्धति के लिए एक स्टैंड-इन होता है ।
कैरी स्वेवेलैंड

जवाबों:


171

with_indexविधि प्रारंभिक सूचकांक की भरपाई के लिए एक वैकल्पिक पैरामीटर लेता है। each_with_indexएक ही बात करता है, लेकिन कोई वैकल्पिक शुरुआती सूचकांक नहीं है।

उदाहरण के लिए:

[:foo, :bar, :baz].each.with_index(2) do |value, index|
    puts "#{index}: #{value}"
end

[:foo, :bar, :baz].each_with_index do |value, index|
    puts "#{index}: #{value}"
end

आउटपुट:

2: foo
3: bar
4: baz

0: foo
1: bar
2: baz

41

each_with_indexरूबी में पहले पेश किया गया था। with_indexबाद में पेश किया गया था:

  1. विभिन्न प्रगणकों के साथ व्यापक उपयोग की अनुमति देने के लिए।
  2. इंडेक्स को एक नंबर से शुरू करने की अनुमति देना 0

आज, उपयोग with_indexसामान्यता और पठनीयता के दृष्टिकोण से बेहतर होगा, लेकिन कोड को गति देने के दृष्टिकोण से, की each_with_indexतुलना में थोड़ा तेज चलता है each.with_index

जब आपको लगता है कि एक एकल विधि आसानी से कुछ तरीकों की सीधी जंजीर द्वारा व्यक्त की जा सकती है, तो यह आमतौर पर मामला है कि एकल विधि श्रृंखला की तुलना में तेज है। इस के एक अन्य उदाहरण के लिए, की reverse_eachतुलना में तेजी से चलाता है reverse.each। इन विधियों के अस्तित्व में होने का कारण है।


1
हालांकि निष्पक्ष होने के लिए, ऑफसेट इंडेक्स को नहीं बदलता है, यह बस इंडेक्स में एक नंबर जोड़ता है। जब आप अपने कॉल के बाद सूचकांक की जांच करते हैं, तो आप पाएंगे कि यह अप्रभावित है। हमेशा की तरह अच्छे नोट, @ सावा
vgoff

2
मुझे नहीं लगता कि perf अलग होना चाहिए (कम से कम पर्याप्त रूप से नहीं)। में reverseउदाहरण के लिए, reverseएक और सरणी, और नहीं एक प्रगणक लौटा रहा है। यदि यह एक एन्यूमरेटर लौटाता है, तो यह एक अच्छा कार्यान्वयन के साथ धीमा नहीं होना चाहिए था।
अकोस्टैडिनोव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.