रूबी: एक स्ट्रिंग में चर विलय


95

मैं रूबी में चर को एक स्ट्रिंग में विलय करने के लिए एक बेहतर तरीके की तलाश कर रहा हूं।

उदाहरण के लिए अगर स्ट्रिंग कुछ इस तरह है:

"द animal actionsecond_animal"

और मेरे पास चर हैं animal, actionऔर second_animal, उन चर को स्ट्रिंग में डालने का पसंदीदा तरीका क्या है?

जवाबों:


240

मुहावरेदार तरीका कुछ इस तरह से लिखना है:

"The #{animal} #{action} the #{second_animal}"

स्ट्रिंग के आसपास के दोहरे कोट्स (") को नोट करें: रूबी के लिए इसके अंतर्निहित प्लेसहोल्डर प्रतिस्थापन का उपयोग करने के लिए यह ट्रिगर है। आप उन्हें एकल उद्धरण (') से बदल नहीं सकते हैं या स्ट्रिंग को उसी तरह रखा जाएगा।


2
क्षमा करें, शायद मैंने समस्या को बहुत सरल कर दिया है। स्ट्रिंग को एक डेटाबेस से खींचा जाएगा, और चर कई कारकों पर निर्भर करेगा। आम तौर पर मैं 1 या दो varibles के लिए एक प्रतिस्थापन का उपयोग करता हूं, लेकिन यह अधिक होने की क्षमता है। कोई विचार?
FearMediocrity

# {} निर्माण संभवत: सबसे तेज़ है (हालांकि अभी भी यह मेरे लिए प्रतिरूप प्रतीत होता है)। साथ ही gix के सुझाव से, आप + या << के साथ स्ट्रिंग्स को इकट्ठा भी कर सकते हैं, लेकिन कुछ इंटरमीडिएट स्ट्रिंग्स बनाए जा सकते हैं, जो महंगा है।
माइक वुडहाउस

वैरिएबल को प्रक्षेपित करने का सबसे अच्छा तरीका
ड्रैगित्सु एलेक्ज़ेंड्रू

115

स्ट्रिंग में मानों को इंजेक्ट करने के लिए आप स्प्रिंटफ़-जैसे फ़ॉर्मेटिंग का उपयोग कर सकते हैं। इसके लिए स्ट्रिंग में प्लेसहोल्डर्स शामिल होने चाहिए। अपने तर्कों को एक सरणी में रखें और इन तरीकों पर उपयोग करें: (अधिक जानकारी के लिए कर्नेल :: स्प्रिंटफ के लिए दस्तावेज़ीकरण देखें )।

fmt = 'The %s %s the %s'
res = fmt % [animal, action, other_animal]  # using %-operator
res = sprintf(fmt, animal, action, other_animal)  # call Kernel.sprintf

तुम भी स्पष्ट रूप से तर्क संख्या निर्दिष्ट कर सकते हैं और उन्हें फेरबदल कर सकते हैं:

'The %3$s %2$s the %1$s' % ['cat', 'eats', 'mouse']

या हैश कीज़ का उपयोग करके तर्क निर्दिष्ट करें:

'The %{animal} %{action} the %{second_animal}' %
  { :animal => 'cat', :action=> 'eats', :second_animal => 'mouse'}

ध्यान दें कि आपको %ऑपरेटर को सभी तर्कों के लिए एक मूल्य प्रदान करना होगा । उदाहरण के लिए, आप परिभाषित करने से बच नहीं सकते animal


18

मैं #{}निर्माणकर्ता का उपयोग करूंगा , जैसा कि अन्य उत्तरों द्वारा कहा गया है। मैं यह भी बताना चाहता हूं कि यहां देखने के लिए यहां एक वास्तविक सूक्ष्मता है:

2.0.0p247 :001 > first_name = 'jim'
 => "jim" 
2.0.0p247 :002 > second_name = 'bob'
 => "bob" 
2.0.0p247 :003 > full_name = '#{first_name} #{second_name}'
 => "\#{first_name} \#{second_name}" # not what we expected, expected "jim bob"
2.0.0p247 :004 > full_name = "#{first_name} #{second_name}"
 => "jim bob" #correct, what we expected

जबकि तार (के रूप में द्वारा प्रदर्शन एकल उद्धरण के साथ बनाया जा सकता है first_nameऔर last_nameचर, निर्माता केवल दोहरे उद्धरण चिह्नों के साथ तार में इस्तेमाल किया जा सकता है।#{}



10

इसे स्ट्रिंग इंटरपोलेशन कहा जाता है, और आप इसे इस तरह करते हैं:

"The #{animal} #{action} the #{second_animal}"

महत्वपूर्ण: यह केवल तभी काम करेगा जब स्ट्रिंग दोहरे उद्धरण चिह्नों ("") के अंदर हो।

उस कोड का उदाहरण जो आपकी अपेक्षा के अनुरूप काम नहीं करेगा:

'The #{animal} #{action} the #{second_animal}'

उचित शब्द का उपयोग करने के लिए धन्यवाद, ताकि नए प्रोग्रामर सीख सकें: प्रक्षेप।
माइक बेथानी

3

आपके परिदृश्य के लिए मानक ईआरबी टेम्प्लेटिंग सिस्टम काम कर सकता है।

def merge_into_string(animal, second_animal, action)
  template = 'The <%=animal%> <%=action%> the <%=second_animal%>'
  ERB.new(template).result(binding)
end

merge_into_string('tiger', 'deer', 'eats')
=> "The tiger eats the deer"

merge_into_string('bird', 'worm', 'finds')
=> "The bird finds the worm"

0

आप इसका उपयोग अपने स्थानीय चर के साथ कर सकते हैं, जैसे:

@animal = "Dog"
@action = "licks"
@second_animal = "Bird"

"The #{@animal} #{@action} the #{@second_animal}"

आउटपुट होगा: "द डॉग लाइकबर्ड "

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.