2013-08-13 10 views
8

रूबी में यह लूप के लिए उपयोग करने के लिए खराब शैली है। यह आमतौर पर समझा जाता है। शैली मार्गदर्शिका में मेरे लिए सिफारिश की: (https://github.com/bbatsov/ruby-style-guide#source-code-layout) का कहना है:मैं रूबी में फॉर-लूप कैसे बदलूं?

"कभी, के लिए उपयोग जब तक आप जानते हैं कि वास्तव में क्यों समय iterators में से अधिकांश के लिए प्रत्येक के मामले में कार्यान्वित किया जाता है के बजाय इस्तेमाल किया जाना चाहिए (ताकि।। आप एक स्तर का संकेत जोड़ रहे हैं), लेकिन एक मोड़ के साथ - एक नया दायरा (प्रत्येक के विपरीत) पेश नहीं करता है और इसके ब्लॉक में परिभाषित चर इसके बाहर दिखाई देंगे। "

दिए गए उदाहरण

है:

arr = [1, 2, 3] 

#bad 
for elem in arr do 
    puts elem 
end 

# good 
arr.each { |elem| puts elem } 

मैं शोध किया है और मैं कैसे पाश है कि एक बार दोहराना मूल्य प्रदान करता है के लिए एक अनुकरण करने के लिए के रूप में एक विवरण नहीं मिल सकता है मैं स्थानों के लिए पास या पर गणित प्रदर्शन कर सकते हैं । उदाहरण के लिए, क्या साथ मैं जगह लेंगे:

for i in 0...size do 
    puts array1[i] 
    puts array2[size-1 - i] 
    puts i % 2 
end 

यह होगा कि यह एक सरणी है, लेकिन मैं अक्सर अन्य प्रयोजनों के लिए मौजूदा स्थिति की जरूरत है आसान है। या तो एक साधारण समाधान है जिसे मैं याद कर रहा हूं, या ऐसी स्थितियां जहां के लिए आवश्यक है। इसके अतिरिक्त, मैं लोगों को के बारे में के बारे में बात करता हूं जैसे कि इसकी आवश्यकता नहीं होती है। इसके बाद उनका समाधान क्या है?

क्या यह बेहतर हो सकता है? और समाधान क्या है, अगर कोई है? धन्यवाद।

उत्तर

10

आप एक संग्रह और सूचकांक का ट्रैक रखने से अधिक पुनरावृति करना चाहते हैं, each_with_index का उपयोग करें:

fields = ["name", "age", "height"] 

fields.each_with_index do |field,i| 
    puts "#{i}. #{field}" # 0. name, 1. age, 2. height 
end 

आपका for i in 0...size उदाहरण बन जाता है:

array1.each_with_index do |item, i| 
    puts item 
    puts array2[size-1 - i] 
    puts i % 2 
end 
+0

मानते हैं कि 'array1' और' array2' का आकार समान है, इसे 'array2 [-1 - i]' के रूप में लिखना सर्वोत्तम है ताकि 'आकार' की गणना करने से बचें। – Borodin

3

मत भूलना आप कर सकते हैं इस तरह की अच्छी चीजें भी

fields = ["name", "age", "height"] 

def output name, idx 
    puts "#{idx}. #{name}" 
end 

fields.each_with_index &method(:output) 

आउटपुट

0. name 
1. age 
2. height 

आप एक वर्ग या उदाहरण के तरीके के रूप में इस तकनीक का उपयोग कर सकते हैं भी

class Printer 
    def self.output data 
    puts "raw: #{data}" 
    end 
end 

class Kanon < Printer 
    def initialize prefix 
    @prefix = prefix 
    end 
    def output data 
    puts "#{@prefix}: #{data}" 
    end 
end 

def print printer, data 
    # separating the block from `each` allows 
    # you to do interesting things 
    data.each &printer.method(:output) 
end 

वर्ग का उपयोग कर उदाहरण विधि

print Printer, ["a", "b", "c"] 
# raw: a 
# raw: b 
# raw: c 

उदाहरण का उपयोग कर उदाहरण विधि

kanon = Kanon.new "kanon prints pretty" 
print kanon, ["a", "b", "c"] 
# kanon prints pretty: a 
# kanon prints pretty: b 
# kanon prints pretty: c 
+0

आप कर सकते थे, लेकिन आप क्यों? यह वास्तव में क्या जोड़ता है? – meagar

+0

यह ब्लॉक को 'प्रत्येक *' पुनरावृत्त से अलग करता है। इसका मतलब है कि आप जहां चाहें ब्लॉक को रोक सकते हैं; यह एक वर्ग या इंस्टेंस विधि हो सकता है, यह एक गतिशील प्रो, आदि हो सकता है। बस कुछ लचीलापन दिखाना जैसे कि ओपी अपेक्षाकृत हरा लगता है। +2 प्राप्त करने के बाद, मुझे नहीं लगता कि मैं अकेला हूं जो इसे उपयोगी भी पाता है। – naomik

+0

मैं मानता हूं कि यह उपयोगी है, लेकिन यह प्रासंगिक या विषय पर नहीं बनाता है। प्रश्न में वर्णित स्थिति में यह उपयोगी नहीं है। – meagar

संबंधित मुद्दे