इस पोस्ट में हम रूबी में कैरेक्टर एस्केपिंग के बारे में बात करने जा रहे हैं। हम सीखेंगे कि कैरेक्टर को कैसे एस्केप करें, यह कैसे काम करता है, और कुछ उपयोग के मामलों के लिए पूरी तरह से एस्केपिंग से कैसे बचें। यदि आप सोचते हैं कि आप \ के बारे में सब जानते हैं, तो इसे पूरा पढ़ें और आश्चर्यचकित हों...
आइए स्ट्रिंग्स में कैरेक्टर एस्केपिंग में गोता लगाएं।
उद्धरण एस्केप करना
रूबी में स्ट्रिंग्स का उपयोग करते समय, हमें कभी-कभी उस उद्धरण को स्ट्रिंग के अंदर रखने की आवश्यकता होती है जिसका उपयोग हमने स्ट्रिंग को परिभाषित करने के लिए किया था। जब हम ऐसा करते हैं, तो हम बैकस्लैश \ प्रतीक के साथ उद्धरण वर्ण को एस्केप कर सकते हैं।
# डबल कोटेड स्ट्रिंग्स में उद्धरण एस्केप करें
"Hello \"world\"!" => "Hello \"world\"!"
# सिंगल कोटेड स्ट्रिंग्स में उद्धरण एस्केप करें
'Hello \'world\'!' => "Hello 'world'!"
यहां हम देख सकते हैं कि रूबी आउटपुट के लिए डबल कोटेड स्ट्रिंग्स को डिफ़ॉल्ट करता है और आउटपुट में केवल उन डबल उद्धरणों को एस्केप करता है।
एस्केप अनुक्रम
उद्धरणों के अलावा, स्ट्रिंग्स में अधिक प्रतीक हैं जिन्हें हम एस्केप कर सकते हैं। उदाहरण के लिए, एक नई लाइन \n द्वारा दर्शाई जाती है। इसे "एस्केप अनुक्रम" कहा जाता है।
"Hello\nworld" => "Hello\nworld"
जो लौटाया जाता है वह वही स्ट्रिंग है जिसे हमने बनाया था, लेकिन जैसा कि आप देख सकते हैं \n हाइलाइट किया गया है, जो दर्शाता है कि यह एक एस्केप अनुक्रम है। यदि हम अब इस स्ट्रिंग को प्रिंट करते हैं तो हम देखते हैं कि शाब्दिक \n प्रिंट नहीं होता, बल्कि एक वास्तविक नई लाइन प्रिंट होती है।
puts "Hello\nworld"
=> Hello
world
यह सिंगल कोटेड स्ट्रिंग्स में काम नहीं करता। \n अनुक्रम को शाब्दिक \n के रूप में व्याख्या किया जाता है। डबल कोटेड स्ट्रिंग्स में आपको उसी परिणाम को प्राप्त करने के लिए बैकस्लैश प्रतीक को एस्केप करना होगा।
'\n' => "\\n"
अन्य एस्केप अनुक्रमों के उदाहरण जो उसी तरह काम करते हैं: \t, \s और \b, जो क्रमशः टैब, स्पेस और बैकस्पेस का प्रतिनिधित्व करते हैं।
सिंगल कोट्स vs और डबल कोट्स
रूबी में सिंगल और डबल कोटेड स्ट्रिंग्स के बीच अंतर यह है कि स्ट्रिंग परिभाषाएं एस्केप अनुक्रमों को कैसे प्रस्तुत करती हैं।
- डबल कोटेड स्ट्रिंग्स में, आप एस्केप अनुक्रम लिख सकते हैं और रूबी उनके अनुवादित अर्थ को आउटपुट करेगा। एक
\nनई लाइन बन जाता है। - सिंगल कोटेड स्ट्रिंग्स में, हालांकि, एस्केप अनुक्रम एस्केप हो जाते हैं और उनकी शाब्दिक परिभाषा लौटाते हैं। एक
\nएक\nरहता है।
दोनों स्ट्रिंग प्रकारों के अपने उपयोग के मामले हैं। संभावना है कि आप उनके अनुवादित अर्थ, नई लाइन या टैब का उपयोग करने के लिए एस्केप अनुक्रमों के साथ डबल कोटेड स्ट्रिंग्स का उपयोग करेंगे।
सिंगल कोट्स एस्केप अनुक्रमों को स्वयं एस्केप करने से बचने के लिए उपयोगी हैं। उनके उपयोग को प्रदर्शित करने या गलती से उन एस्केप अनुक्रमों का उपयोग करने से बचने के लिए उपयोगी जिन्हें आप इरादा नहीं करते थे।
puts "Line 1\nLine 2"
=> Line 1
Line 2
puts 'Using a \n we can indicate a newline.'
=> Using a \n we can indicate a newline.
इंटरपोलेशन एस्केप करना
रूबी स्ट्रिंग्स के अंदर इंटरपोलेशन का समर्थन करता है। लेकिन एक बार फिर, सभी स्ट्रिंग परिभाषाएं समान नहीं बनाई गई हैं। इंटरपोलेशन केवल डबल कोटेड स्ट्रिंग्स में काम करता है।
नीचे दिए गए कोड उदाहरण में हम देखते हैं कि इंटरपोलेशन डबल कोटेड स्ट्रिंग में काम करता है, लेकिन रूबी सिंगल कोटेड स्ट्रिंग में इंटरपोलेशन अनुक्रम को एस्केप कर देता है, जिससे यह बेकार हो जाता है।
name = "world"
"Hello #{name}" => "Hello world"
'Hello #{name}' => "Hello \#{name}"
यह व्यवहार लगभग हर प्रकार के स्ट्रिंग "जादू" पर लागू होता है। डबल कोट्स इसका समर्थन करते हैं, सिंगल कोट्स नहीं।
स्ट्रिंग के लिए प्रतिशत नोटेशन
रूबी में प्रतिशत नोटेशन पर्ल प्रोग्रामिंग भाषा से प्रेरित है और हमें कुछ सामान्य प्रकार परिभाषाओं के लिए कई शॉर्टहैंड देता है।
सिंगल और डबल कोटेड स्ट्रिंग्स के लिए वही व्यवहार प्रतिशत नोटेशन पर भी लागू होता है।
%()और%Q()डबल कोटेड स्ट्रिंग के समान व्यवहार करते हैं।%q()सिंगल कोटेड स्ट्रिंग के समान व्यवहार करता है।
प्रतिशत नोटेशन के साथ समस्या यह है कि अब जब पैरेंथेसिस संतुलित नहीं होते तो आपको उद्धरणों के बजाय पैरेंथेसिस वर्ण () को एस्केप करने की आवश्यकता होती है।
यही कारण है कि रूबी आपको प्रतिशत नोटेशन के लिए अन्य प्रतीकों का उपयोग करने की अनुमति भी देता है: %[foo], %{foo}, %-foo-, %?foo?, आदि। यह %"foo" और %'foo' का भी समर्थन करता है।
यहां हम देखते हैं कि रूबी प्रतिशत नोटेशन का उपयोग करते समय हमारे लिए स्ट्रिंग को एस्केप करता है।
%(Hello "world"!) => "Hello \"world\""
# असंतुलित पैरेंथेसिस के साथ
%(Hello world\)!) => "Hello world)!"
# संतुलित पैरेंथेसिस के साथ
%(Hello (world)!) => "Hello (world)!"
फिर से, वही नियम यहां लागू होते हैं जैसे सामान्य सिंगल और डबल कोटेड स्ट्रिंग्स के साथ। एस्केप अनुक्रम और इंटरपोलेशन डिफ़ॉल्ट रूप से सिंगल कोटेड स्ट्रिंग्स में एस्केप हो जाते हैं।
name = "world"
%(Hello\n "#{name}"!) => "Hello\n \"world\"!"
%q(Hello\n "#{name}"!) => "Hello\\n \"\#{name}\"!"
%Q(Hello\n "#{name}"!) => "Hello\n \"world\"!"
नियमित अभिव्यक्तियों में कैरेक्टर एस्केप करना
कैरेक्टर एस्केप करना नियमित अभिव्यक्तियों में भी काम करता है। नियमित अभिव्यक्तियों में कई वर्ण उनके शाब्दिक परिभाषा से अधिक का प्रतिनिधित्व करते हैं।
. किसी भी वर्ण के लिए वाइल्ड कार्ड है, ब्रैकेट [] एक रेंज या चयन का प्रतिनिधित्व करते हैं, पैरेंथेसिस () एक अभिव्यक्ति से मेल खाते हैं, आदि। उनके शाब्दिक परिभाषाओं का उपयोग करने के लिए हम उन्हें बैकस्लैश प्रतीक से भी एस्केप कर सकते हैं।
/Hello \[world\]/ => /Hello \[world\]/
/\[world\]/ =~ "Hello [world]" => 6
यदि हम ब्रैकेट को एस्केप नहीं करते, तो यह ब्रैकेट के बीच के किसी भी वर्ण को ढूंढेगा और "Hello" में वर्ण l पर स्थिति 3 पर पहला मिलान ढूंढेगा।
/[world]/ =~ "Hello [world]" => 2 # शून्य इंडेक्स
फॉरवर्ड स्लैश प्रतीक / से बचने के लिए, जिसका उपयोग नियमित अभिव्यक्ति को परिभाषित करने के लिए किया जाता है, हम एक अन्य प्रतिशत नोटेशन का उपयोग कर सकते हैं।
%r{/world/} => /\/world\//
%r{} का उपयोग करके हम एक नियमित अभिव्यक्ति परिभाषित कर सकते हैं जहां हमें फॉरवर्ड स्लैश को एस्केप करने की आवश्यकता नहीं है। परिणाम में हम देख सकते हैं कि रूबी हमारे लिए फॉरवर्ड स्लैश को एस्केप करता है।
लाइन ब्रेक एस्केप करना
पहले हमने रूबी में स्ट्रिंग में "नई लाइन" एस्केप अनुक्रम \n को एस्केप किया था। क्या आप जानते हैं कि आप रूबी में स्वयं एक लाइन ब्रेक को भी एस्केप कर सकते हैं?
उदाहरण के लिए, हमारे पास एक मेथड कॉल के लिए एक बहुत लंबी लाइन है और यह हमारे कोड स्टाइल गाइड के अधिकतम लाइन लंबाई को तोड़ती है।
ruby_method_with_many_arguments "Hello world", split: " ", join: "\n"
हम आर्गुमेंट को अलग-अलग लाइनों पर रख सकते हैं ताकि प्रत्येक व्यक्तिगत लाइन छोटी हो। यह तब तक काम करता है जब तक पिछली लाइन कॉमा ,, प्लस प्रतीक + जैसे ऑपरेटर के साथ समाप्त होती है, या पैरेंथेसिस () में लिपटे मेथड कॉल का हिस्सा होती है।
ruby_method_with_many_arguments "Hello world", split: " ", join: "\n"
ruby_method_with_many_arguments(
"Hello world", split: " ", join: "\n"
)
यदि इसके बजाय हम सभी आर्गुमेंट को पैरेंथेसिस () में लपेटे बिना समान इंडेंटेशन स्तर पर संरेखित करना चाहते हैं तो हम लाइन ब्रेक को एस्केप करने के लिए बैकस्लैश \ का उपयोग कर सकते हैं।
ruby_method_with_many_arguments \
my_string, split: " ", join: "\n"
यहां हम वास्तव में रूबी को नई लाइन को एस्केप करने के लिए नहीं कह रहे हैं, बल्कि यह कि कथन अगली लाइन पर जारी रहेगा।
स्ट्रिंग परिभाषाओं में लाइन ब्रेक एस्केप करना
लाइन अंत को एस्केप करना स्ट्रिंग परिभाषाओं जैसी चीजों के लिए भी काम करता है। आम तौर पर यदि हमारे पास एक बहु-लाइन स्ट्रिंग है तो हम दो लाइनों पर स्ट्रिंग्स को जोड़ने के लिए प्लस प्रतीक + का उपयोग कर सकते हैं।
"foo" + "bar" => "foobar"
यह दो लाइनों पर दो नई स्ट्रिंग्स बनाता है और फिर उन्हें एक के रूप में जोड़ता है। तो यह वास्तव में तीन स्ट्रिंग ऑब्जेक्ट बनाता है।
प्लस प्रतीक का उपयोग करने के बजाय, हम बैकस्लैश के साथ फिर से लाइन ब्रेक को एस्केप कर सकते हैं।
"foo" \ "bar" => "foobar"
परिणाम वही है, या यह है?
पहले उदाहरण में हम वास्तव में दो नई स्ट्रिंग्स को जोड़ रहे हैं, जबकि दूसरे उदाहरण में रूबी केवल एक बनाएगा। रूबी इंटरप्रेटर बैकस्लैश \ को स्ट्रिंग परिभाषा की निरंतरता के रूप में देखेगा और दो लाइनों के आधार पर केवल एक स्ट्रिंग बनाएगा। तो यह आपके ऐप के मेमोरी उपयोग के लिए भी बेहतर है।
निष्कर्ष
रूबी, और कई अन्य प्रोग्रामिंग भाषाओं में, कैरेक्टर एस्केप करना काफी भ्रमित करने वाला हो सकता है। अचानक वर्णों के कुछ संयोजन डबल कोटेड स्ट्रिंग के अंदर उपयोग किए जाने पर सिंगल कोटेड स्ट्रिंग में उपयोग किए जाने की तुलना में अलग अर्थ प्राप्त करते हैं।
उम्मीद है कि इस छोटे गाइड ने आपको रूबी में कैरेक्टर और अनुक्रम को ठीक से एस्केप करने के तरीके को समझने में मदद की है। डबल और सिंगल कोटेड स्ट्रिंग के बीच का अंतर यहां महत्वपूर्ण है।
स्ट्रिंग "जादू" एस्केप अनुक्रम और इंटरपोलेशन वास्तव में केवल डबल कोटेड स्ट्रिंग्स में काम करता है, लेकिन सिंगल कोटेड स्ट्रिंग्स में नहीं।
रूबी में कोड एस्केप करने के अन्य तरीके भी हैं। प्रतिशत नोटेशन हमें हर समय कुछ वर्णों को एस्केप करने से बचने में मदद करता है, स्ट्रिंग्स और नियमित अभिव्यक्तियों में।
लेकिन बैकस्लैश बहु-लाइन स्ट्रिंग्स लिखने और रूबी कोड की एक लाइन को अगली लाइन पर जारी रखने के लिए भी बहुत उपयोगी है। कुछ ऐसा जिसका मैं अपने कोड को साफ और पठनीय रखने के लिए बहुत उपयोग करता हूं।
@AppSignal पर हमें बताएं यदि आप अधिक जानना चाहते हैं, या रूबी में कैरेक्टर एस्केपिंग के बारे में कोई विशिष्ट प्रश्न है।
मजेदार साइड-नोट: इस पोस्ट के लिए, जो मार्कडाउन में लिखी गई है, मुझे बैकस्लैश प्रतीक का काफी उपयोग करना पड़ा। रूबी की तरह ही, मार्कडाउन कुछ वर्णों को एस्केप करने की अनुमति देता है। आम तौर पर मार्कडाउन में आप वास्तव में बैकस्लैश को कोड ब्लॉक में लपेट नहीं सकते क्योंकि यह कोड ब्लॉक को ही एस्केप कर देता है। इसके बजाय मैंने इसे स्पेस को एस्केप कराया।
`\` # काम नहीं करता
`\ ` # काम करता है :)