রুবিতে সবকিছুর মতোই একটি String হলো একটি অবজেক্ট।
স্ট্রিংগুলো বাইটের (সাধারণত ক্যারেক্টারের) একটি ইচ্ছামতো ক্রম দিয়ে তৈরি, আর এগুলোকে অন্য যেকোনো অবজেক্টের মতোই ইনিশিয়ালাইজ ও ম্যানিপুলেট করা হয়।
আসলে রুবির সবচেয়ে কাজের দিকগুলোর একটি হলো স্ট্রিংয়ের (এবং অন্যান্য অবজেক্টের) ওপর ডাকা যায় এমন অসংখ্য মেথড, যা কোড লেখার সময় আপনার অনেক সময় বাঁচিয়ে দেয়।
এই অনুশীলনীতে আমরা সেই সহায়ক মেথডগুলোর কয়েকটি ঘুরে দেখব আর সেগুলো নিয়ে খেলব।
String.new(...) দিয়ে স্ট্রিং তৈরি করা গেলেও, লিটারাল ব্যবহার করাই অনেক বেশি কমন।
আপনি নানা রকমের লিটারাল ব্যবহার করতে পারেন, আর সেগুলো দুটি ভাগে ভাগ হয়: যেগুলো ইন্টারপোলেশন সমর্থন করে এবং যেগুলো করে না।
সবচেয়ে কমন লিটারাল হলো সিঙ্গেল ও ডাবল কোট ('...' and "...")।
সিঙ্গেল কোটে ইন্টারপোলেশন চলে না, আর ডাবল কোটে চলে।
ইন্টারপোলেশন হলো #{} সিনট্যাক্স ব্যবহার করে একটি স্ট্রিংকে আরেকটির ভেতরে যুক্ত করা।
# Use single quotes when not interpolated
location = 'World'
# And double quotes when interpolated
puts "Hello, #{location}!" #=> "Hello, World!"
ইন্টারপোলেটেড স্ট্রিংয়ের জন্য %{... } আর নন-ইন্টারপোলেটেড স্ট্রিংয়ের জন্য %q{...}-এর মতো অন্য লিটারালও ব্যবহার করতে পারেন।
আপনার স্ট্রিংয়ের ভেতরে ' বা " ক্যারেক্টার থাকলে এগুলো কাজে লাগে।
নোট: আপনার স্ট্রিংয়ে ইন্টারপোলেশন না থাকলেই যে নন-ইন্টারপোলেটেড স্ট্রিং ব্যবহার করতেই হবে, এমন কোনো কঠোর নিয়ম নেই।
রুবির স্ট্রিংকে অ্যারের মতো ভেবেই দেখাটা কাজে দেয়।
এগুলোর একটি সাইজ থাকে, আর এগুলোর ক্যারেক্টারগুলো ইনডেক্স করা থাকে (0 হলো প্রথম ইনডেক্স):
my_string = "Some string"
my_string.size #=> 11
my_string[0] #=> 'S'
my_string[1] #=> 'o'
my_string[-1] #=> 'g'
# Find the first index of a character
my_string.index('m') #=> 2
ইনডেক্স বা slice ব্যবহার করে স্ট্রিংয়ের অংশ বের করা যায়:
my_string = "Some string"
# Find three characters starting with the second character (index 1)
my_string[1, 3] #=> "ome"
my_string.slice(1, 3) #=> "ome"
স্ট্রিংয়ের সিমান্টিক মানও ম্যানিপুলেট করা যায়। সব মেথড সম্পর্কে জানতে রুবির ডকুমেন্টেশন ঘেঁটে দেখা কাজে দেবে, তবে এখানে কমনভাবে ব্যবহৃত কয়েকটি উদাহরণ দেওয়া হলো:
"hello".capitalize #=> "Hello"
"HELLO".downcase #=> "hello"
"hello".center(9) #=> " hello "
" hello ".strip #=> "hello"
"hello world".split(" ") #=> ["hello", "world"]
এছাড়া ক্যারেক্টার বদলাতে gsub-এর মতো মেথডও ব্যবহার করতে পারেন:
# Replace one character with another
"noob".gsub("o","0") #=> "n00b"
# (Advanced) Replace a regular expression
"Ruby really rocks".gsub(/[aieou]/,'') #=> "Rby rlly rcks"
উপরের সব উদাহরণেই একটি নতুন String রিটার্ন করা হয়।
তবে অনেক মেথডেরই ! দিয়ে শেষ হওয়া সমতুল্য রূপ আছে, যেগুলো আসলে স্ট্রিংটিকেই বদলে দেয়।
# Use normal methods to return new strings
my_string = "hello"
my_string.capitalize #=> "Hello"
puts my_string #=> "hello"
# And bang-methods (...!) to modify the object
my_string = "hello"
my_string.capitalize! #=> "Hello"
puts my_string #=> "Hello"
এই অনুশীলনীতে আপনি লগ লাইন প্রসেস করবেন।
প্রতিটি লগ লাইন একটি স্ট্রিং, যার ফরম্যাট হলো: "[<LEVEL>]: <MESSAGE>"।
তিনটি আলাদা লগ লেভেল আছে:
INFOWARNINGERRORআপনার তিনটি কাজ আছে, প্রতিটিতে একটি লগ লাইন নিয়ে সেটি দিয়ে কিছু একটা করতে হবে। এই কাজগুলো সমাধান করার অনেক উপায় আছে, উপরের উদাহরণগুলো থেকে আপনার পছন্দের পদ্ধতি বেছে নিন এবং দেখুন আপনি কী বের করতে পারেন।
লগ লাইনের মেসেজ রিটার্ন করার জন্য LogLineParser#message মেথডটি ইমপ্লিমেন্ট করুন:
LogLineParser.new('[ERROR]: Invalid operation').message
# => "Invalid operation"
শুরুতে বা শেষে থাকা যেকোনো হোয়াইটস্পেস সরিয়ে ফেলা উচিত:
LogLineParser.new("[WARNING]: Disk almost full\r\n").message
# => "Disk almost full"
লগ লাইনের লগ লেভেল রিটার্ন করার জন্য LogLineParser#log_level মেথডটি ইমপ্লিমেন্ট করুন, যেটি ছোট হাতের অক্ষরে রিটার্ন করা উচিত:
LogLineParser.new('[ERROR]: Invalid operation').log_level
# => "error"
LogLineParser#reformat মেথডটি ইমপ্লিমেন্ট করুন, যা লগ লাইনটি রিফরম্যাট করে, মেসেজটি আগে বসায় এবং তার পরে বন্ধনীর ভেতরে লগ লেভেল বসায়:
LogLineParser.new('[INFO]: Operation completed').reformat
# => "Operation completed (info)"
Exercism-এ সাইন আপ করুন, Ruby ট্র্যাকের 21টি কনসেপ্ট121টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।