Introduction আজকের এই আলোচনায় আমরা শিখবো Rust প্রোগ্রামিং ল্যাঙ্গুয়েজে Strings কীভাবে কাজ করে। আমরা অনেকেই অন্য প্রোগ্রামিং ল্যাঙ্গুয়েজে স্ট্রিং ব্যবহার করেছি, কিন্তু Rust-এ এটি একটু আলাদা এবং অনেক বেশি শক্তিশালী। বিশেষ করে UTF-8 এনকোডিং ব্যবহার করার কারণে এটি বিশ্বের যেকোনো ভাষা (যেমন- বাংলা, হিন্দি, জাপানিজ) খুব সহজেই বুঝতে পারে। চলুন সহজভাবে এই বিষয়গুলো দেখে নেওয়া যাক।
১. UTF-8 এনকোডিং এবং স্ট্রিং কী?
ভিডিও রেফারেন্স: [00:55]
Rust-এ স্ট্রিংগুলো মূলত UTF-8 encoded। আগেকার সময়ে 'ASCII' এনকোডিং ব্যবহার করা হতো যেখানে একটি অক্ষরের জন্য ১ বাইট জায়গা লাগতো, যার ফলে শুধু ইংরেজি অক্ষর রাখা যেত। কিন্তু UTF-8-এ একটি অক্ষরের জন্য ১ থেকে ৪ বাইট পর্যন্ত জায়গা লাগতে পারে। এর সুবিধা হলো, আমরা শুধু ইংরেজি নয়, বরং বাংলা, ইমোজি বা যেকোনো ভাষা স্ট্রিং হিসেবে সেভ করতে পারি।
-
UTF-8: এটি একটি আন্তর্জাতিক স্ট্যান্ডার্ড যা পৃথিবীর সব বর্ণমালার অক্ষরকে কম্পিউটারের বোঝার উপযোগী করে তোলে।
-
Encoding: সহজ ভাষায়, মানুষের ভাষাকে কম্পিউটারের ভাষায় (বাইনারি/নাম্বার) রূপান্তর করার পদ্ধতি।
২. স্ট্রিং তৈরি এবং পরিবর্তন (Push & Concatenation)
ভিডিও রেফারেন্স: [02:30]
Rust-এ আপনি চাইলে স্ট্রিংয়ের শেষে নতুন লেখা যোগ করতে পারেন। এর জন্য push_str (পুরো বাক্য যোগ করতে) এবং push (একটি মাত্র অক্ষর যোগ করতে) ব্যবহার করা হয়।
কোড উদাহরণ:
Rust
fn main() {
let mut s = String::from("হ্যালো"); // একটি স্ট্রিং তৈরি করা হলো
s.push_str(" বন্ধু"); // পুরো একটি শব্দ যোগ করা
s.push('!'); // একটি মাত্র ক্যারেক্টার যোগ করা
println!("{}", s); // আউটপুট: হ্যালো বন্ধু!
}
ব্যাখ্যা: এখানে mut ব্যবহার করা হয়েছে কারণ আমরা স্ট্রিংটিকে পরিবর্তন করতে চাই। push_str দিয়ে বড় টেক্সট আর push দিয়ে একটি সিঙ্গেল কোটেশনের মধ্যে থাকা ক্যারেক্টার যোগ করা হয়।
৩. ফরম্যাট ম্যাক্রো (Format Macro) ব্যবহার
ভিডিও রেফারেন্স: [06:40]
যখন অনেকগুলো স্ট্রিং একসাথে জুড়তে হয়, তখন + অপারেটর ব্যবহার করা কিছুটা জটিল হয়ে পড়ে কারণ এটি ওনারশিপ (Ownership) নিয়ে নেয়। এর সহজ সমাধান হলো format! ব্যবহার করা।
কোড উদাহরণ:
Rust
fn main() {
let s1 = String::from("Rust");
let s2 = String::from("is");
let s3 = String::from("awesome");
// format! ব্যবহার করে সবগুলো জোড়া দেওয়া
let s = format!("{}-{}-{}", s1, s2, s3);
println!("{}", s); // আউটপুট: Rust-is-awesome
}
ব্যাখ্যা: format! ফাংশনটি অনেকটা println! এর মতো কাজ করে, কিন্তু এটি স্ক্রিনে প্রিন্ট না করে একটি নতুন স্ট্রিং রিটার্ন করে। এতে মূল স্ট্রিংগুলোর কোনো ক্ষতি হয় না।
৪. স্ট্রিং ইনডেক্সিং কেন কাজ করে না?
ভিডিও রেফারেন্স: [07:13]
অন্যান্য ল্যাঙ্গুয়েজে (যেমন Python বা JavaScript) আপনি s[0] লিখে প্রথম অক্ষর পেতে পারেন, কিন্তু Rust-এ এটি সরাসরি সম্ভব নয়। এর কারণ হলো UTF-8। ধরুন আপনি একটি হিন্দি শব্দ "नमस्ते" (Namaste) লিখলেন। এখানে বাইরে থেকে দেখে মনে হতে পারে ৫-৬টি অক্ষর আছে, কিন্তু মেমোরিতে এটি ১৮ বাইট জায়গা নিতে পারে। যদি আপনি s[0] কল করেন, তবে সেটি একটি পূর্ণাঙ্গ অক্ষর না দিয়ে অর্ধেক ডাটা দিতে পারে যা প্রোগ্রাম ক্র্যাশ করাতে পারে।
- Indexing: কোনো লিস্ট বা স্ট্রিংয়ের নির্দিষ্ট পজিশন থেকে ডাটা খুঁজে বের করা।
৫. বাইটস, স্কেলার এবং গ্রাফিন ক্লাস্টারস (Bytes, Scalars, Grapheme Clusters)
ভিডিও রেফারেন্স: [10:53]
Rust-এ একটি স্ট্রিংকে তিনভাবে দেখা যায়: ১. Bytes: মেমোরিতে ডাটা যেভাবে জমা থাকে (নাম্বার হিসেবে)। ২. Scalar Values: প্রতিটি ইউনিকোড ক্যারেক্টার আলাদাভাবে। ৩. Grapheme Clusters: আমরা মানুষরা যেভাবে অক্ষরগুলোকে দেখি (যেমন- 'ন' একটি গ্রাফিন)।
কোড উদাহরণ (কিভাবে অক্ষর বা বাইট প্রিন্ট করবেন):
Rust
fn main() {
let s = "नमस्ते";
// বাইট প্রিন্ট করা
for b in s.bytes() {
print!("{} ", b);
}
println!();
// ক্যারেক্টার প্রিন্ট করা
for c in s.chars() {
print!("{} ", c);
}
}
ব্যাখ্যা: s.bytes() আপনাকে ওই শব্দের মেমোরি ভ্যালু দেখাবে আর s.chars() আপনাকে প্রতিটি ক্যারেক্টার আলাদা করে দেখাবে।
বিশ্লেষণ ও আমার মতামত
কন্টেন্ট ক্রিয়েটরের উদ্দেশ্য: পিযুষ গর্গ এখানে বোঝাতে চেয়েছেন যে, Rust ল্যাঙ্গুয়েজ স্ট্রিং হ্যান্ডল করার ক্ষেত্রে খুবই সতর্ক। এটি ডেভেলপারকে বাধ্য করে বুঝতে যে ইন্টারনালি ডাটা কীভাবে কাজ করছে। এটি শুরুতে কঠিন মনে হলেও ভবিষ্যতে বড় ধরনের বাগ (Bug) বা এরর থেকে বাঁচায়।
বাস্তব প্রেক্ষাপট ও পরামর্শ: জাভাস্ক্রিপ্টে আমরা স্ট্রিং নিয়ে খুব সহজে কাজ করি কারণ সেখানে পেছনের জটিলতাগুলো লুকানো থাকে। কিন্তু সিস্টেম প্রোগ্রামিং বা হাই-পারফরম্যান্স অ্যাপ বানাতে গেলে Rust-এর এই কঠোর নিয়মগুলো আসলে আশীর্বাদ।
বিকল্প বা সাজেশান: যদি আপনার অনেক জটিল স্ট্রিং বা আন্তর্জাতিক ভাষা নিয়ে কাজ করতে হয়, তবে ভিডিওতে দেখানো unicode-segmentation নামক এক্সটার্নাল লাইব্রেরিটি ব্যবহার করা ভালো। এটি স্ট্রিংকে মানুষের বোঝার মতো (Grapheme) ছোট ছোট ভাগে ভাগ করতে দারুণ সাহায্য করে।
সহজ ভাষায় শেষ কথা: Rust-এ স্ট্রিং মানে শুধু কিছু অক্ষরের সমষ্টি নয়, এটি মেমোরি এবং এনকোডিংয়ের একটি চমৎকার সমন্বয়। শিখতে সময় লাগলেও এটি আপনার কোডিং সেন্স অনেক বাড়িয়ে দেবে।
[
Storing UTF-8 Encoded Text with Strings | Rust Book
Piyush Garg · 1.9K views
](http://www.youtube.com/watch?v=oKGD7JmLOEI)

মন্তব্যসমূহ
একটি মন্তব্য পোস্ট করুন
আপনার সমস্যাটি কমেন্ট করে আমাদের জানান :-d