2010-07-27 8 views
13

मैं इस समय रूबी और आरओआर सीख रहा हूं, और मैं इस पर आया:रूबी में "एक्स इन वाई के लिए" का क्या मतलब है?

<% for post in @posts %> 

Rails guide में। मुझे समझ में आया कि रूबी में ऐसा करने का बेवकूफ तरीका है:

<% @posts.each do |post| %> 

यदि कोई अंतर है तो यह क्या है? और यदि कोई फर्क नहीं पड़ता है तो क्या रेल लोगों के लिए उचित रूबी मुहावरे को धक्का देना बेहतर नहीं होगा (इसके बजाय, जो मुझे अधिक पाइथनिक दिखता है)?

संपादित करें: मुझे अभी इस बारे में दो विरोधाभासी स्पष्टीकरण मिले हैं: Tutorials Point का कहना है कि वे एक हैं "एक लूप स्थानीय चर के लिए एक नया दायरा नहीं बनाता है", जबकि CS.Auckland.ac.NZ कहते हैं for है बराबर .each के लिए सिर्फ वाक्य रचनात्मक चीनी।

संपादित 2: प्रश्न में for ... inapp/views/posts द्वारा app/views/posts में उत्पन्न index.html.erb के लिए script/generate scaffold था। मैंने एक त्वरित जांच की है और अब .each वाक्यविन्यास उत्पन्न करता है। मुझे लगता है कि गाइड का हिस्सा रेल विकास के पहले चरण में लिखा गया था जब मचान for ... in उत्पन्न हुआ था।

संपादित 3: अब मैं पुष्टि कर सकता हूं कि for x in y रेल 2.2.2 में प्रयोग किया गया था, लेकिन 2.3.8 से यह y.each do |x| का उपयोग कर रहा है। बस तुम इतना जानते हो।

उत्तर

21

ट्यूटोरियलपॉइंट पेज सही है, for स्कॉइंग अंतर को छोड़कर each के बराबर है। यहां एक प्रदर्शन है:

arr = [1,2,3] 
arr.each do |x| 
    last = x 
end 
last # NameError 

बनाम।

arr = [1,2,3] 
for x in arr 
    last = x 
end 
last #=> 3 

आप इसे each का उपयोग कर काम करने के लिए चाहते हैं, आप पाश से पहले last = nil की ज़रूरत है। यह है, जैसा लिंक ने इंगित किया है, क्योंकि ब्लॉक for नहीं करते हैं, जबकि ब्लॉक एक नया दायरा शुरू करते हैं।

नोट हालांकि यह शायद ही कभी व्यावहारिक अंतर बनाता है और कुछ लोगों को इसके बारे में भी पता है। for और each के बीच कोई मतभेद की वजह से नहीं -

लोगों माणिक में for का उपयोग करते हैं यह सबसे अधिक बार क्या वे अन्य भाषाओं से आ रही करने के लिए इस्तेमाल कर रहे हैं, क्योंकि वह है।

+0

धन्यवाद! ठीक वही जो मेरे द्वारा खोजा जा रहा था। यह मुझे वापस मेरे मूल बिंदु पर ले जाता है, यही कारण है कि रेल टीम (या कम से कम जो भी प्रारंभ करने वाली मार्गदर्शिका लिखती है) 'के लिए ... वाक्यविन्यास' के साथ जाती है? – Skilldrick

+2

ऐसे बहुत सारे लोग हैं जो पहले रूबी सीखने के बिना रेल सीखते हैं। मुझे लगता है कि मार्गदर्शिका एक ऐसी शैली में लिखी गई है जिसका उद्देश्य अन्य भाषाओं से आने वाले लोगों से परिचित होना है। – sepp2k

+0

उन दोनों के बीच एक संबंधित अंतर जो कि उस उदाहरण से स्पष्ट नहीं है: 'a = []; एक्स के लिए [1,2,3,4]; एक << proc {x} अंत; नक्शा (&: कॉल) '' 4,4,4,4] 'देता है जबकि 'प्रत्येक' के बराबर' 1,2,3,4] 'प्रदान करेगा क्योंकि प्रत्येक 'एक नया' x' बाध्यकारी पेश करता है प्रत्येक पुनरावृत्ति के साथ। – Chuck

0

बात यह है कि पहला उदाहरण (for post in @posts), लग रहा है और अधिक "प्रक्रियात्मक" जबकि दूसरा (@posts.each do |post|) लग रहा है और अधिक "कार्यात्मक" है। दुर्भाग्य से, कोड पढ़ने के लिए प्रक्रियात्मक तरीका अभी भी अधिक लोकप्रिय, अधिक स्पष्ट और कम "geeky" माना जाता है। यही कारण है कि, शायद, कई इसे कंटेनरों के माध्यम से पुनरावृत्त करने के "मूल" तरीके से पसंद करेंगे।

यदि यह पाइथोनिक दिखता है (मुझे यकीन नहीं है कि यह सच है), तो इसे और भी बेहतर माना जा सकता है, क्योंकि यह अन्य प्लेटफार्मों से आने वाले डेवलपर्स द्वारा रेल की पहुंच में सुधार करता है।

व्यक्तिगत रूप से, मुझे रूबी और "कार्यात्मक" तरीकों को धक्का देना पसंद है। लेकिन उपरोक्त कारण बताते हैं कि इसे किसी भी तरह से किया जा सकता है।

+0

मुझे लगता है कि यह पाइथनिक दिखता है क्योंकि 'इन ... इन' पाइथन में पुन: प्रयास करने का मानक तरीका है। – Skilldrick

+1

@skill, साथ ही साथ यह अन्य भाषाओं में अप्रचलित करने का एक मानक तरीका है (उदाहरण के लिए अप्रचलित पर्ल वाक्यविन्यास)। यह किसी भी संग्रह के माध्यम से * प्राकृतिक * (अर्थ में मनुष्य इसके बारे में कैसे बात करते हैं) है। –

+0

हाँ, मैं देखता हूं कि आपका क्या मतलब है। मैं जरूरी नहीं कह रहा था कि वे पाइथन की प्रतिलिपि बना रहे थे, बस यह पाइथन की तरह दिखता है। – Skilldrick

0

कुछ दिन मैं जिस वेबसाइट पर काम कर रहा था, उसके लिए पीडीएफ रिपोर्ट तैयार करने की सुविधा विकसित कर रहा था।

मैं जिस प्लगइन का उपयोग कर रहा था, उसकी कई सीमाएं थीं। उन सीमाओं ने मुझे समाधान का उत्पादन करने के लिए मजबूर किया जो बहुत जरूरी और प्रक्रियात्मक था। मैं प्रोग्रामिंग की इस शैली पर जोर देने के लिए while या for जैसे निर्माण का उपयोग कर रहा था।

वास्तव में, यह एकमात्र स्थिति थी जब मैंने रूबी में उन कीवर्ड का उपयोग किया था।

0

यदि आप रूबी प्रोफाइलिंग करने की कोशिश कर रहे हैं और रूबी-प्रोफेसर के आपके संस्करण में method elimination नहीं है तो आप for x in y का उपयोग करना चाह सकते हैं।

0

एक और बात के बारे में for x in y कि आप for i in 1..5 जो पाश के लिए एक मानक, i = 1 से शुरू होकर i = 5 से गुजर रही की तरह काम करेगा कर सकते हैं।

इस बारे में काम बात यह है कि आप 3..8 या x..y की तरह एक सीमा का उपयोग कर सकते है, तो आप शून्य से शुरू है, जो आप n.times विधि का उपयोग कर किया जाएगा अटक नहीं कर रहे हैं।

+0

1.upto (5) .each {| x | # कुछ} उसका ख्याल रखना? – graydot

+0

@jeba ya यह होगा। मैं रूबी के लिए अपेक्षाकृत नया हूं, इसलिए मैंने इसे पहले नहीं देखा था। इसलिए आपका धन्यवाद! मुझे हर दिन कुछ नया सीखना अच्छा लगता है! –

+2

आप '(1..5) भी कर सकते हैं। – Skilldrick