2010-11-28 3 views
6

एक।सुरुचिपूर्ण रूबी एक लाइनर्स कारणों मैं रूबी में लेखन पसंद इतना है क्योंकि यह एक लाइनर्स के माध्यम से एक बहुत प्राप्त करने के बहुत सक्षम है की

मुझे पसंद है:

@sentence = @sentence.split(' ').map!{|x| x = x[0..0].upcase << x[1..-1] }.join(' ') 

यह प्रत्येक शब्द है, जो सबसे चौंकाने वाली नहीं है, लेकिन काफी कुशल है के पहले अक्षर को बड़ा करता।

सबसे खूबसूरत एक लाइनर आप देखा या रूबी के साथ लिखा है क्या है?

+2

संपादित करें और इसे व्यक्तिपरक होने के लिए बंद कर दिया (कोई वास्तविक जवाब) से बचने के लिए एक समुदाय विकी के रूप में चिह्नित करते हैं, कृपया :) – Matchu

+0

सवाल समुदाय विकी चिह्नित करने के लिए एक समय पहले हटा दिया गया था की क्षमता। इसे देखें: http://meta.stackexchange.com/questions/392/should-the-community-wiki-police-be-shut-down –

+6

मैं उस "सुरुचिपूर्ण" को नहीं कहूंगा, क्योंकि यह लगभग अपठनीय है। यदि कोई अन्य प्रोग्रामर इस कोड से मुकाबला करता है, तो उसे यह जानने के लिए कई मिनट खर्च करना होगा कि वह क्या करने की कोशिश कर रहा है। यह सुरुचिपूर्ण से अधिक गूढ़ है। आपने पठनीयता की कीमत पर कीस्ट्रोक सहेजे हैं। – DOK

उत्तर

28

आप oneliner पोस्ट:

@sentence = @sentence.split(' ').map!{|x| x = x[0..0].upcase << x[1..-1] }.join(' ') 

लेकिन आप रूबी के बारे में कुछ बातें गलत।

सबसे पहले, एक नक्शा कॉल में x= कह नक्शा कॉल के बाहर कुछ भी प्रभावित नहीं करता। उस सरणी तत्व का नया मान ब्लॉक द्वारा लौटा दिया गया है।

दूसरा, आपको << के साथ पहली स्ट्रिंग को म्यूट करने की आवश्यकता नहीं है - एक नई स्ट्रिंग बनाता है जो एक नई स्ट्रिंग बनाता है (+ का उपयोग करके) एक बेहतर विकल्प है।

तीसरा, map! सीधे split द्वारा लौटाए गए सरणी में परिवर्तन करता है। आप जो करना चाहते हैं वह उस सरणी को छूटे हुए छोड़ दें (भले ही यह प्रोग्राम सेमेन्टिक्स नहीं बदले), और map का उपयोग कर मैप किए गए परिणामों के साथ एक नई सरणी लौटाएं।

तो तुम लिखा जाना चाहिए था:

@sentence = @sentence.split(' ').map{|x| x[0..0].upcase + x[1..-1] }.join(' ') 

अब बयान x[0..0].upcase + x[1..-1] अभी भी बहुत कुंठित है। शायद आपको इसे capitalize विधि से प्रतिस्थापित करना चाहिए, जो पहले से स्ट्रिंग के पहले अक्षर को अपरकेस में बदल देता है। (ध्यान दें यह भी दूसरों के सभी downcases कि जो या नहीं हो सकता है कि तुम क्या चाहते हैं।)

@sentence = @sentence.split(' ').map{|x| x.capitalize }.join(' ') 

मैं शायद gsub! प्रयोग करेंगे यथा-स्थान स्ट्रिंग के कुछ हिस्सों को बदलने के लिए है, लेकिन यह शायद एक छोटे से है प्राप्त करें:

@sentence.gsub!(/\S+/){|x| x.capitalize} 

एक और बात। एक ब्लॉक का एकमात्र उद्देश्य वस्तु ब्लॉक करने के लिए पारित कर दिया पर एक ही विधि कॉल करने के लिए है, तो आप निम्न कर सकते हैं:

@sentence = @sentence.split(' ').map(&:capitalize).join(' ') 

या मेरे gsub! संस्करण संशोधित करने के लिए:

@sentence.gsub!(/\S+/,&:capitalize) 
+12

अभी, आप या तो पूरी तरह से अपनी भावना बिखर चुके हैं, या उसने एक-लाइनर के लिए अपने उत्साह को तीन गुना बढ़ा दिया है। –

+0

मैं यहां प्रतिक्रियाओं से बहुत कुछ सीखने की उम्मीद कर रहा था, और केन की टिप्पणी एक आदर्श शैक्षणिक यात्रा रही है! निश्चित रूप से एक लाइनर उत्साह x12'd x3'd – kez

+3

+1 '@sentence = @ वाक्य.split ('')। Map (&: capitalize) .join ('') 'वह है जिसे मैं सुरुचिपूर्ण कहूंगा। –

1

आप हो सकता है Ruby Quiz #113 पर एक नज़र डालना चाहते हैं।

0

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

ruby -i.bak -pe "print ($_!~/string/ && $.<2) ? \"string\n\":''" filename.txt 
0

फाइबोनैचि अनुक्रम जनरेटर:

def fib n;n==0?[0]:n==1?[0,1]:(2..n-1).inject([0,1]){|a|a<<(a[-1]+a[-2])};end 

एक ही रूप में:

मैं किसी को उम्मीद है कि इस एक पर सुधार

def fib n;n<2?(0..n-1).to_a():(2..n-1).inject([0,1]){|a|a<<(a[-1]+a[-2])};end 
0

खुला एक फ़ाइल, यह करने के लिए लिखते हैं, और इसे एक पंक्ति में बंद करें:

File.open(File.join(Rails.root, 'lib', 'assets', 'file.txt'), 'a+') {|f| f.write("stuff"+"\n" } 
हर दिन लिपियों में

मेरे सबसे अच्छे रूबी एक-लाइनर्स के अधिकांश का उपयोग and, unless, if, && और बहुत आगे है, जैसे:

puts "x is nil!" if x.nil? 

आप unless और if दूसरे के स्थान पर, लेकिन unless उपयोग कर सकते हैं काफी पठनीयता में सुधार जब सही ढंग से उपयोग किया जाता है:

puts "bad input type!" unless ["bs", "cf", "is"].include?(type) 

अक्सर, सबसे अच्छा रूबी एक-लाइनर अंततः दो से तीन पंक्तियों में किया जाता है

def try_first(actual_index) 
    x = [get_header(actual_index, 0), get_data(actual_index, 0)] unless get_header(actual_index, 0).blank? 
    x = try_second(actual_index) if x[0].blank? #blank is a rails method, detects nil and empty strings and empty containers ([]) I think too 
    puts "x is nil!" if x.nil? 
    x 
end 

मैं एक-लाइनर्स क्योंकि उस विधि के कई एक-लाइनर्स से बना कहते हैं: एक-लाइनर्स चर के लिए रूबी के "संयोजक" प्रणाली (nil और false केवल "नकारात्मक" कर रहे हैं) के साथ अक्सर संयोजन के रूप में, एक साथ काम मेरे कोड में कहीं और एक लाइनर से भी कम है। मेरी कई विधियों में से केवल एक पंक्ति हालांकि:

def get_all_coords(type) 
    eval("@#{type}_coords") 
end 

इस तरह आप वास्तव में सुरुचिपूर्ण होने लगते हैं। व्यक्तिगत तरीकों से कोड तोड़ो। एक लाइन विधि सही हैं।

0

बिल्कुल जीआरईपी (विंडोज उपयोगकर्ता) का यह अनुकरण। [credit goes to Dave Thomas]

ruby -pe 'next unless $_ =~ /regexp/' < file.txt 
0
पक्का

फिबोनैकी संख्या!

def fib(n, t = n < 2 ? n : fib(n-1) + fib(n-2)) t; end 
संबंधित मुद्दे

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