2010-03-12 10 views
30

मेरे पास 4 स्ट्रिंग चर name, quest, favorite_color, speed है जो खाली हो सकता है। मैं उन सभी के बीच रिक्त स्थान बनाना चाहता हूं जो खाली नहीं हैं। कोड की सरलता, यानी देखना और समझना कितना आसान है, गति से अधिक महत्वपूर्ण है।रूबी concatenate तारों और रिक्त स्थान जोड़ें

तो:

name = 'Tim' 
quest = 'destroy' 
favorite_color = 'red' 
speed = 'fast' 

'Tim destroy red fast' 

और

name = 'Steve' 
quest = '' 
favorite_color = '' 
speed = 'slow' 

हो जाता हो जाता है:

'Steve slow' 

ध्यान दें कि 'स्टीव' और 'धीमी' के बीच केवल 1 स्थान है।

मैं यह कैसे कर सकता हूं (अधिमानतः 1 लाइन में)?

उत्तर

67
[name, quest, favorite_color, speed].reject(&:empty?).join(' ') 
+1

जब मैं इसका परीक्षण करता हूं, तो मुझे निम्न त्रुटि मिलती है: "लाइन 5 पर त्रुटि: गलत तर्क प्रकार प्रतीक (अपेक्षित प्रो)" मुझे क्या याद आ रही है? –

+0

शायद आप रुबी <1.8.7 का उपयोग कर रहे हैं। '[नाम, खोज, पसंदीदा_color, गति] .reject {| एस | कोशिश करें s.empty?}। शामिल हों ('') ' –

+0

रुबी का कौन सा संस्करण? यह भी कोशिश कर सकता है: [नाम, खोज, पसंदीदा_color, गति] .reject {| s | s.empty?}। शामिल हों ('') –

5

आप इंजेक्षन का उपयोग कर सकते हैं:

[name,quest,favorite_color,speed].inject("") {|k,v| v.empty? ? k : k << " " << v }.strip 
+0

एक काम कर जवाब के लिए +1 की कोशिश करें, हालांकि यह कम पढ़ने के लिए दूसरों की तुलना में आसान (और इस प्रकार रखरखाव) है। –

+0

आप सभी बिंदुओं पर सही हैं। हारून का जवाब बेहतर है। –

18

[name,quest,favorite_color,speed].join(' ').squeeze(' ')

+1

यह एक सबसे आसान लगता है। – Allyn

+0

यह भी सबसे तेज़ है। – ghoppe

+0

यह केवल रिक्त स्थान खींच जाएगा। लेकिन यदि व्यक्तिगत स्ट्रिंग में रिक्त स्थान हैं, तो मैं उन्हें हटा नहीं सकता। –

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