डबल बनाम एकल उद्धरण


171

मैं रूबी के लिए वास्तव में नया हूं और यह समझने की कोशिश कर रहा हूं कि क्या कोई विशिष्ट समय है जब मुझे ""बनाम का उपयोग करना चाहिए ''

मैं ज्यादातर समय एकल उद्धरणों का उपयोग कर रहा हूं क्योंकि यह टाइप करना आसान है लेकिन मुझे यकीन नहीं है कि मुझे करना चाहिए।

जैसे get 'user/new'बनामget "user/new"


12
क्या आप सुनिश्चित हैं कि यह एक RoR प्रश्न है, और केवल रूबी प्रश्न नहीं है?
इग्नासियो वाज़क्वेज़-अब्राम्स

जब स्ट्रिंग प्रक्षेप की आवश्यकता नहीं है, तो चुनने पर एक प्रासंगिक शैली गाइड है?
विलियम एंट्रीकेन

जवाबों:


202

" " आपको स्ट्रिंग प्रक्षेप करने की अनुमति देता है, जैसे:

world_type = 'Mars'
"Hello #{world_type}"

1
तो मूल रूप से, बस हर समय दोहरे उद्धरण चिह्नों का उपयोग करें, है ना?
नीकोनरी

8
नहीं - डबल उद्धरण बस स्ट्रिंग प्रक्षेप के लिए अनुमति देते हैं। यदि आप स्ट्रिंग प्रक्षेप नहीं चाहते हैं, तो आपको दोहरे उद्धरण चिह्नों का उपयोग नहीं करना चाहिए।
पान

4
केवल दोहरे उद्धरण चिह्नों का उपयोग करने का कोई कारण नहीं है जब आपको प्रक्षेप की आवश्यकता होती है, तो कोई महत्वपूर्ण प्रदर्शन प्रभाव नहीं होता है और यह सिर्फ आपको यह सोच कर देगा कि आपको क्या उपयोग करना है। बस डबल-उद्धृत स्ट्रिंग्स का उपयोग करें।
मैथ्यूज

137

प्रक्षेप को छोड़कर, एक और अंतर यह है कि 'एस्केप सीक्वेंस' एकल उद्धरण में काम नहीं करता है

puts 'a\nb' # just print a\nb 
puts "a\nb" # print a, then b at newline 

42
केवल एक उद्धरण से बचने के लिए छोड़कर, जैसे 'don\'t'
स्पार्कहॉक

3
इस qvestion का यह बहुत उपयोगी उत्तर है। मुझे कभी यह एहसास नहीं हुआ कि सिंगल-कोटिंग का मतलब एकल उद्धरणों के बीच सब कुछ छपाई के लिए था, उद्धरणों के अपवाद के साथ जो बच जाना चाहिए। धन्यवाद।
जय गोडसे

6
और बैकस्लैश भी कोशिश करें puts '\\'यह केवल एकल स्लैश प्रिंट करेगा। यहाँ देखें stackoverflow.com/questions/25499046/…
हार्दिक

हाँ, केवल दो मामले हैं जो आप एकल उद्धरण के साथ बच सकते हैं
एलेक्सिस

@ एलेक्सिस को यकीन नहीं है, शायद प्रदर्शन पर थोड़ा अंतर है
lfx_cool

40

अपने प्रश्न का उत्तर देने के लिए, आपको ""स्ट्रिंग इंटरपोलेशन करने के लिए उपयोग करना होगा:

a = 2
puts "#{a}"

अन्यथा सरल उद्धरणों का उपयोग करें।

इसके अलावा अगर आप सोच रहे हैं कि क्या प्रदर्शन के मामले में कोई अंतर है, तो StackOverflow पर इस बारे में एक उत्कृष्ट सवाल है।

और अगर आप आरओआर के लिए वास्तव में नए हैं, तो मैं आपसे भाषा की मूल बातें जानने के लिए एक अच्छी रूबी पुस्तक लेने का आग्रह करता हूं। यह समझने में मदद करेगा कि आप क्या कर रहे हैं (और आपको यह सोचने से रोक देगा कि रेल जादू है)। मैं व्यक्तिगत रूप से द ग्राउंडेड रूबिस्ट की सिफारिश करता हूं


34

सिंगल ''और डबल कोट्स में अंतर होता है""एक स्ट्रिंग का मूल्यांकन करने के लिए रूबी में में ।

प्रारंभ में, मैं स्पष्ट करना चाहूंगा कि स्ट्रिंग के शाब्दिक रूप में जो भी सिंगल या डबल के बीच है कोट्स के होता है, उसे एक स्ट्रिंग ऑब्जेक्ट के रूप में मूल्यांकन किया जाता है, जो रूबी स्ट्रिंग वर्ग का एक उदाहरण है।

इसलिए, 'stackoverflow'और "stackoverflow"दोनों स्ट्रिंग क्लास के उदाहरणों का मूल्यांकन करेंगे जिनमें कोई अंतर नहीं है

अंतर

स्ट्रिंग्स (सिंगल या डबल कोट्स) के दो शाब्दिक रूपों के बीच आवश्यक अंतर यह है कि डबल उद्धरण से बचने के दृश्यों की अनुमति मिलती है जबकि एकल उद्धरण नहीं!

सिंगल कोट्स द्वारा बनाया गया एक स्ट्रिंग शाब्दिक स्ट्रिंग इंटरपोलेशन का समर्थन नहीं करता है और दृश्यों से बचता नहीं है।

एक साफ उदाहरण है:

"\n" # will be interpreted as a new line

जहाँ तक

'\n' # will display the actual escape sequence to the user

एकल उद्धरण के साथ इंटरपोलिंग बिल्कुल काम नहीं करता है:

'#{Time.now}'
=> "\#{Time.now}" # which is not what you want..

सर्वश्रेष्ठ प्रणालियां

जैसा कि रूबी लिंटर्स में से अधिकांश का सुझाव है कि अपने तार के लिए एकल उद्धरण शाब्दिक का उपयोग करें और प्रक्षेप / भागने के क्रम के मामले में डबल वालों के लिए जाएं।


1
इसलिए यदि आपके पास एक = '\ n' और b = "# {a}" है, तो क्या b को एक नई पंक्ति या एस्केप सीक्वेंस के रूप में समझा जाएगा?
नाथनटेम्पेलमैन

4
जिस क्षण आप a = '\ n' असाइन करते हैं, आपको एक नई पंक्ति प्राप्त करने के लिए a से b तक इंटरपॉलिंग करके "\\ n" के रूप में व्याख्या की जाती है। b "\\ n" (कोई नई पंक्ति जो आपको भागने का क्रम मिले) के लिए विकसित होगी। a = '\ n' => "\\ n" जहां a = "\ n" => "\ n" के रूप में
aloucas

6

एकल-उद्धृत स्ट्रिंग्स ASCII एस्केप कोड (\ n, \ t आदि) को संसाधित नहीं करते हैं, और वे स्ट्रिंग इंटरपोलेशन नहीं करते हैं जबकि डबल-उद्धृत दोनों करते हैं।

पलायन कोड उदाहरण:

2.4.0 :004 >   puts 'Hello \n World'
Hello \n World

2.4.0 :005 > puts "Hello \n World"
Hello
World

प्रक्षेप उदाहरण:

2.4.0 :008 >   age=27
 => 27

2.4.0 :009 > puts 'Age: #{age}'
Age: #{age}

2.4.0 :009 > puts "Age: #{age}"
Age: 27

4

मुद्रण में उत्तर "\ n" के समान, निम्नलिखित अंतर का एक और मामला है

puts "\1"  -> get special character
puts '\1'  -> get \1

ऐसा लगता है कि * दोहरे उद्धरण चिह्नों में बच चरित्र में बदल गया था, लेकिन एकल उद्धरण में नहीं। BTW, यह आउटपुट को प्रभावित करेगा जब नियमित अभिव्यक्ति जैसे, str.gsub (/ नियमित अभिव्यक्ति /, '\ 1, \ 2)


2

एकल-उद्धरणों का उपयोग करने के लिए एक और कारण जब आप एक स्ट्रिंग के रूप में एक रेगेक्स पैटर्न पास कर रहे हैं:

यह regex पैटर्न काम करेगा क्योंकि सिंगल-कोट्स में पास किया गया है:

"123 ABC".match('\d')
=> #<MatchData "1">

यह regex पैटर्न विफल हो जाएगा क्योंकि दोहरे उद्धरण चिह्नों के भीतर पारित कर दिया गया है (आपको इसे काम पर लाने के लिए इसे डबल-एस्केप करना होगा):

"123 ABC".match("\d")
=> nil

-8

इस विशिष्ट मामले में, इससे कोई फर्क नहीं पड़ता कि आप इसे कैसे लिखते हैं। वे बराबर हैं। इसके अलावा, आप कुछ और रूबी गाइड / ट्यूटोरियल पढ़ना चाहते हैं :)


4
वे समकक्ष नहीं हैं, क्योंकि दोहरे उद्धरण स्ट्रिंग व्याख्या के लिए अनुमति देते हैं।
जेसन नोबल

7
क्या आपने उस अत्यंत चतुर अवलोकन करने से पहले "इस विशिष्ट मामले में" भाग पढ़ा था?
जियो

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