আজকের এই আলোচনায় আমরা শিখব কীভাবে Rust প্রোগ্রামিং ল্যাঙ্গুয়েজে Structs ব্যবহার করে কোডকে আরও গোছানো এবং সুন্দর করা যায়। সাধারণত যখন আমরা কোনো ডেটা নিয়ে কাজ করি, তখন অনেকগুলো এলোমেলো ভেরিয়েবল ব্যবহার না করে সেগুলোকে একটি নির্দিষ্ট কাঠামোর মধ্যে আনাই হলো Structs-এর আসল কাজ। আমরা একটি আয়তক্ষেত্রের (Rectangle) ক্ষেত্রফল বের করার উদাহরণের মাধ্যমে এটি সহজভাবে বুঝব।
১. সাধারণ ফাংশন থেকে Struct-এর দিকে যাত্রা
ভিডিও রেফারেন্স: [00:45]
শুরুতে আমরা যদি একটি আয়তক্ষেত্রের ক্ষেত্রফল বের করতে চাই, তবে সাধারণত দুটি আলাদা ভেরিয়েবল (প্রস্থ বা width এবং উচ্চতা বা height) ব্যবহার করি।
কোড উদাহরণ:
Rust
fn calculate_area(width: u32, height: u32) -> u32 {
width * height
}
fn main() {
let w = 100;
let h = 200;
let area = calculate_area(w, h);
println!("আয়তক্ষেত্রের ক্ষেত্রফল হলো: {}", area);
}
ব্যাখ্যা: এই কোডটি কাজ করলেও এতে একটি সমস্যা আছে। width এবং height সম্পূর্ণ আলাদা দুটি ভেরিয়েবল। এদের মধ্যে যে কোনো সম্পর্ক আছে, তা কোড দেখে বোঝা কঠিন। এছাড়া ফাংশনে ভুল করে উল্টোপাল্টা ভ্যালু দেওয়ার সম্ভাবনা থাকে।
- সহজ কথা: যখন অনেকগুলো তথ্য মিলে একটি নির্দিষ্ট জিনিস বোঝায় (যেমন- নাম, বয়স, আইডি মিলে একজন ছাত্র), তখন সেগুলোকে আলাদা না রেখে একসাথে রাখাই বুদ্ধিমানের কাজ।
২. Struct ব্যবহার করে কোডকে গোছানো
ভিডিও রেফারেন্স: [05:28]
এখন আমরা Rectangle নামে একটি Struct তৈরি করব। এটি মূলত একটি কাস্টম ডেটা টাইপ, যেখানে আমরা বলে দেব যে একটি আয়তক্ষেত্রের মধ্যে কী কী থাকবে।
কোড উদাহরণ:
Rust
struct Rectangle {
width: u32,
height: u32,
}
fn calculate_area(rect: &Rectangle) -> u32 {
rect.width * rect.height
}
fn main() {
let rect1 = Rectangle {
width: 100,
height: 200,
};
let area = calculate_area(&rect1);
println!("Struct ব্যবহার করে ক্ষেত্রফল: {}", area);
}
ব্যাখ্যা: - এখানে struct Rectangle লিখে আমরা একটি কাঠামো তৈরি করেছি।
-
ফাংশনের ভেতর এখন আমরা আলাদা ভেরিয়েবল না পাঠিয়ে সরাসরি পুরো
Rectangle-কে পাঠিয়েছি। -
Borrowing (&): লক্ষ্য করুন ফাংশনে আমরা
&Rectangleব্যবহার করেছি। এর মানে হলো আমরা শুধু আয়তক্ষেত্রের তথ্যগুলো "ধার" নিচ্ছি, এর মালিকানা (Ownership) কেড়ে নিচ্ছি না। ফলে পরে আমরাrect1আবার ব্যবহার করতে পারব।
৩. Struct-এর তথ্য প্রিন্ট করা এবং Debug Trait
ভিডিও রেফারেন্স: [09:00]
আমরা যদি সাধারণ println! দিয়ে একটি Struct প্রিন্ট করতে চাই, তবে Rust আমাদের এরর দেখাবে। কারণ Rust জানে না আপনি এই কাঠামোটি কীভাবে স্ক্রিনে দেখাতে চান। এর জন্য আমাদের Debug Trait ব্যবহার করতে হয়।
কঠিন শব্দ: Trait (ট্রেট) - এটি অনেকটা কিছু নিয়মের সমষ্টির মতো। যেমন কোনো স্ট্রাক্টকে যদি প্রিন্ট করতে হয়, তবে তাকে "Debug" ট্রেট মানতে হয়।
কোড উদাহরণ:
Rust
#[derive(Debug)] // এই লাইনটি ডিবাগিং সুবিধা চালু করে
struct Rectangle {
width: u32,
height: u32,
}
fn main() {
let rect1 = Rectangle {
width: 30,
height: 50,
};
// {:?} ব্যবহার করা হয় ডিবাগ ফরম্যাটে প্রিন্ট করার জন্য
println!("আমাদের আয়তক্ষেত্রটি হলো: {:?}", rect1);
// আরও সুন্দর করে দেখতে {:#?} ব্যবহার করুন
println!("সুন্দর ফরম্যাটে: {:#?}", rect1);
}
ব্যাখ্যা:
-
#[derive(Debug)]লাইনটি Rust-কে বলে দেয় যে এই Struct-টি ডিবাগ করার জন্য তৈরি। -
{:?}বা{:#?}ব্যবহার করে আমরা পুরো ডাটা স্ট্রাকচারটি একসাথে দেখতে পারি, যা কোডিংয়ের ভুল ধরতে খুব সাহায্য করে।
৪. DBG! ম্যাক্রো ব্যবহার করা
ভিডিও রেফারেন্স: [13:00]
Rust-এ প্রিন্ট করার আরেকটি চমৎকার উপায় হলো dbg! ম্যাক্রো। এটি শুধু ভ্যালু প্রিন্ট করে না, বরং কোডের কোন ফাইলে এবং কত নম্বর লাইনে এই প্রিন্টটি হচ্ছে তাও জানিয়ে দেয়।
কোড উদাহরণ:
Rust
let rect1 = Rectangle {
width: dbg!(30 * 2), // এখানে ডিরেক্ট ক্যালকুলেশন ডিবাগ করা যায়
height: 50,
};
dbg!(&rect1); // পুরো স্ট্রাক্টটি ডিবাগ করবে
আমার বিশ্লেষণ ও চিন্তাভাবনা (Analysis & Perception)
কন্টেন্ট ক্রিয়েটর পিয়ুষ গর্গ এখানে বোঝাতে চেয়েছেন যে, প্রোগ্রামিং শুধু কাজ করার জন্য নয়, বরং কোডকে পঠনযোগ্য (Readable) করার জন্যও শিখতে হয়। সাধারণ ভেরিয়েবল থেকে Struct-এ আসার যাত্রাটি আসলে কোডকে আরও শক্তিশালী করার একটি ধাপ।
বাস্তবতা ও সাজেশন:
-
কেন Struct ব্যবহার করবেন? আপনি যখন বড় কোনো প্রোজেক্টে কাজ করবেন, তখন শত শত ভেরিয়েবল মনে রাখা সম্ভব নয়। Struct ব্যবহার করলে ডেটার মধ্যে একটি গ্রুপিং থাকে, যা ভুল হওয়ার সম্ভাবনা কমায়।
-
বিকল্প: অনেকে 'Tuples' ব্যবহার করতে পারেন, কিন্তু টাপলে ডেটার কোনো নাম থাকে না (যেমন index 0, index 1)। তাই প্রফেশনাল কাজে Struct-ই সেরা পছন্দ।
-
পরামর্শ: সবসময় Struct ডিফাইন করার সময়
#[derive(Debug)]ব্যবহার করার অভ্যাস করুন। এটি আপনার ডেভেলপমেন্ট সময় অনেক কমিয়ে দেবে।
পরবর্তী ধাপে এই Struct-এর সাথেই কীভাবে ফাংশন যুক্ত করা যায় (যাকে Method বলা হয়), তা শিখলে Rust-এ আপনার দখল আরও বাড়বে।
[
Defining and Instantiating Structs | Rust Book
Piyush Garg · 2.9K views
](http://www.youtube.com/watch?v=OZ93b2PH7nU)

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