এই পোস্টে আমরা রুবির চরিত্র থেকে পালিয়ে যাওয়া সম্পর্কে কথা বলতে যাচ্ছি। আমরা শিখব কীভাবে অক্ষরগুলি এড়িয়ে যেতে হয়, এটি কীভাবে কাজ করে এবং কীভাবে কিছু ব্যবহারের ক্ষেত্রে সম্পূর্ণরূপে পালানো এড়াতে হয়। আপনি যদি মনে করেন আপনি \
সম্পর্কে সব জানেন , এটি সব পড়ুন এবং অবাক হতে ভুলবেন না...
চলুন স্ট্রিং-এ অক্ষর পালানোর সাথে সরাসরি ডুব দেওয়া যাক।
এসকেপিং কোট
রুবিতে স্ট্রিং ব্যবহার করার সময়, আমাদের মাঝে মাঝে স্ট্রিংটির ভিতরে স্ট্রিংটি সংজ্ঞায়িত করার জন্য আমরা যে উদ্ধৃতিটি ব্যবহার করেছি তা রাখতে হবে৷ যখন আমরা করি, তখন আমরা একটি ব্যাকস্ল্যাশ \
দিয়ে উদ্ধৃতি অক্ষরটি এড়িয়ে যেতে পারি। প্রতীক।
# Escape quotes in double quoted strings
"Hello \"world\"!"
=> "Hello \"world\"!"
# Escape quotes in single quoted strings
'Hello \'world\'!'
=> "Hello 'world'!"
এখানে আমরা দেখতে পাচ্ছি যে রুবি ডিফল্ট আউটপুটের জন্য দ্বিগুণ উদ্ধৃতি স্ট্রিং করে এবং শুধুমাত্র আউটপুটে সেই ডবল উদ্ধৃতিগুলি এড়িয়ে যায়।
এস্কেপ সিকোয়েন্স
উদ্ধৃতি ছাড়াও, আরও চিহ্ন রয়েছে যা আমরা স্ট্রিংগুলিতে এড়িয়ে যেতে পারি। উদাহরণস্বরূপ, একটি নতুন লাইন \n
দ্বারা উপস্থাপিত হয় . এটিকে "এস্কেপ সিকোয়েন্স" বলা হয়।
"Hello\nworld"
=> "Hello\nworld"
আমরা যে স্ট্রিং তৈরি করেছি তা ফেরত দেওয়া হয়, কিন্তু আপনি \n
দেখতে পাচ্ছেন হাইলাইট করা হয়েছে, ইঙ্গিত করে এটি একটি পালানোর ক্রম। যদি আমরা এখন এই স্ট্রিংটি প্রিন্ট করি তাহলে আমরা দেখতে পাই যে আক্ষরিক \n
মুদ্রিত হয় না, তবে একটি প্রকৃত নতুন লাইন মুদ্রিত হয়।
puts "Hello\nworld"
=> Hello
world
এটি একক উদ্ধৃত স্ট্রিংগুলিতে কাজ করে না। \n
ক্রমকে আক্ষরিক \n
হিসাবে ব্যাখ্যা করা হয় . ডবল উদ্ধৃত স্ট্রিংগুলিতে একই ফলাফল অর্জন করতে আপনাকে ব্যাকস্ল্যাশ চিহ্ন থেকে বাঁচতে হবে।
'\n'
=> "\\n"
অন্যান্য এস্কেপ সিকোয়েন্সের উদাহরণ যা একইভাবে কাজ করে:\t
, \s
এবং \b
, যা যথাক্রমে একটি ট্যাব, একটি স্থান এবং একটি ব্যাকস্পেস প্রতিনিধিত্ব করে।
একক উদ্ধৃতি <স্ট্রাইক>বনামস্ট্রাইক> এবং ডবল উদ্ধৃতি
রুবিতে একক এবং দ্বিগুণ উদ্ধৃত স্ট্রিংগুলির মধ্যে পার্থক্য হল যেভাবে স্ট্রিং সংজ্ঞাগুলি এস্কেপ সিকোয়েন্সগুলিকে উপস্থাপন করে৷
- ডবল-এ উদ্ধৃত স্ট্রিং, আপনি এস্কেপ সিকোয়েন্স লিখতে পারেন এবং রুবি তাদের অনুবাদিত অর্থ আউটপুট করবে। একটি
\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\""
# With unbalanced parenthesis
%(Hello world\)!)
=> "Hello world)!"
# With balanced parenthesis
%(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
যদি আমরা বন্ধনীগুলি এড়িয়ে না যাই, তবে এটি বন্ধনীগুলির মধ্যে যে কোনও অক্ষর সন্ধান করবে এবং l
অক্ষরের মধ্যে প্রথম মিল খুঁজে পাবে। পজিশন 3-এ "হ্যালো" এ।
/[world]/ =~ "Hello [world]"
=> 2 # zero index
ফরোয়ার্ড স্ল্যাশ চিহ্ন /
এড়ানোর জন্য , রেগুলার এক্সপ্রেশন সংজ্ঞায়িত করতে ব্যবহৃত হয়, আমরা অন্য শতাংশ স্বরলিপি ব্যবহার করতে পারি।
%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-এ আমাদের জানান।
মজার সাইড-নোট:এই পোস্টের জন্য, যা মার্কডাউনে লেখা আছে, আমাকে ব্যাকস্ল্যাশ চিহ্নটি ব্যবহার করতে হয়েছিল। রুবির মতোই, মার্কডাউন নির্দিষ্ট অক্ষর থেকে বেরিয়ে যাওয়ার অনুমতি দেয়। সাধারণত মার্কডাউনে আপনি একটি কোড ব্লকে একটি ব্যাকস্ল্যাশ মুড়ে দিতে পারবেন না কারণ এটি কোড ব্লক থেকে বেরিয়ে যায়। পরিবর্তে আমি এর পরিবর্তে একটি স্পেস এস্কেপ করেছিলাম।
`\` # Doesn't work
`\ ` # Works :)