2010-01-22 14 views
7

मैं एक जावा/सी ++ प्रोग्रामर हूँ और रूबी मेरी पहली पटकथा भाषा है। मैं कभी कभी लगता है कि मैं इसे उपयोग कर रहा हूँ के रूप में नहीं उत्पादकता मैं कर सकता के रूप में कुछ क्षेत्रों में, उदाहरण के लिए इस तरह:त्वरित सलाह: रूबी में यह कैसे लिखा जाना चाहिए?

उद्देश्य: एक फ़ाइल से केवल कुछ लाइनों पार्स करने के लिए। जिस पैटर्न के साथ मैं जा रहा हूं वह यह है कि 15 से अधिक आकार के साथ एक बहुत बड़ी रेखा है, शेष निश्चित रूप से छोटे हैं। मैं बड़े (पहले सहित) सभी लाइनों को अनदेखा करना चाहता हूं।

def do_something(str) 
    puts str 
end 


str = 
'ignore me 
me too! 
LARGE LINE ahahahahha its a line! 
target1 
target2 
target3' 

flag1 = nil 
str.each_line do |line| 
    do_something(line) if flag1 
    flag1 = 1 if line.size > 15 
end 

मैंने यह लिखा, लेकिन मुझे लगता है कि इसे बहुत बेहतर लिखा जा सकता है, यानी ध्वज स्थापित करने से बेहतर तरीका होना चाहिए। रुबी की खूबसूरत रेखाओं को लिखने के लिए सिफारिशों का भी स्वागत है।

नोट/स्पष्टीकरण: मैं बड़ी लाइन की पहली उपस्थिति के बाद सभी लाइनों मुद्रित करने के लिए की जरूरत है।

+0

आप परिभाषित कर सकता हूँ "बेहतर" अपने करते पाश वास्तव में क्या करता है आप केवल कोड की कुछ लाइनों में चाहते हैं और यह पढ़ सकते हैं और इरादे को समझने के लिए बहुत आसान है। – Beanish

+0

प्रदर्शन से बेहतर नहीं है, लेकिन बेहतर दिख रहा है। अब तक प्रदान किए गए उदाहरण वे हैं जो मैं ढूंढ रहा हूं (ज्यादातर, अगर केवल स्पष्टीकरण को बेहतर ढंग से पढ़ा जाए)। – Zombies

उत्तर

10
str.lines.drop_while {|l| l.length < 15 }.drop(1).each {|l| do_something(l) } 

मुझे यह पसंद है, अगर आप यह बाएं से दाएं पढ़ें, यह अपने मूल का वर्णन जैसी लगभग ठीक पढ़ा जाता है क्योंकि:

स्प्लिट लाइनों में स्ट्रिंग और लाइनों की तुलना में कम ड्रॉप 15 अक्षर फिर एक और पंक्ति छोड़ दो (यानी 14 से अधिक वर्णों वाला पहला वाला)। फिर प्रत्येक शेष रेखा के साथ कुछ करो।

आपको यह सत्यापित करने में सक्षम होने के लिए सभी पर रुबी, या प्रोग्रामिंग को आवश्यक रूप से समझने की आवश्यकता नहीं है या नहीं।

+0

यदि आप स्थिति को संशोधित करते हैं तो आप उस अतिरिक्त ड्रॉप से ​​छुटकारा पा सकते हैं <=। Drop_while के बारे में कभी नहीं पता था। धन्यवाद! – Farrel

+0

@ फेरेल: नहीं आप नहीं कर सकते। यदि लंबी लाइन में 15 से अधिक वर्ण हैं, तो यह ठीक पहले कार्य करेगा। यदि इसमें बिल्कुल 15 वर्ण हैं, तो यह पूरी स्ट्रिंग को छोड़ देगा। – sepp2k

+0

Farrel: अगर लंबी लाइन में 15 से अधिक वर्ण लंबा (उदाहरण की तरह) है, तो आप अभी भी अतिरिक्त ड्रॉप की आवश्यकता होगी। साथ ही, मुझे यह समझना होगा कि ड्रॉप-साइड काफी साफ है। – abeger

3
require 'enumerator' # Not needed in Ruby 1.9 

str.each_line.inject(false) do |flag, line| 
    do_something(line) if flag 
    flag || line.size > 15 
end 
1
lines = str.split($/) 
start_index = 1 + lines.find_index {|l| l.size > 15 } 
lines[start_index..-1].each do |l| 
    do_something(l) 
end 
+0

यह काम 1.8.6 में करता है? मुझे अपरिभाषित विधि 'रेखाएं' त्रुटि – Zombies

+0

नहीं मिलती है, लाइन 1.8.7 में नई है। मैं विभाजन का उपयोग करने के लिए जवाब अद्यतन कर दूंगा। – mckeed

+0

1.8.6 में, तार पहले से ही लाइनों की एक सरणी माना जाता है, इसलिए आप इसे ज़रूरत नहीं है। 1.9 में, तारों को लाइनों, वर्णों, बाइट्स या कोडपॉइंट्स की सरणी माना जाता है, इसलिए आपको स्पष्ट रूप से कहना होगा कि आप कौन सा व्यवहार चाहते हैं। –

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

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