এই ভিডিওতে পিয়ুষ গর্গ আমাদের শিখিয়েছেন কীভাবে Rust প্রোগ্রামিং ল্যাঙ্গুয়েজে Struct-এর সাথে Methods এবং Associated Functions ব্যবহার করতে হয়। সহজ কথায়, কোনো একটি ডাটা স্ট্রাকচারের সাথে সম্পর্কিত কাজগুলোকে কীভাবে গুছিয়ে লেখা যায়, সেটাই এখানে দেখানো হয়েছে।
১. মেথড কী এবং ফাংশনের সাথে এর পার্থক্য
ভিডিওর শুরুতে মেথড সম্পর্কে ধারণা দেওয়া হয়েছে।
ভিডিও রেফারেন্স: [00:20]
বিস্তারিত আলোচনা: মেথড অনেকটা সাধারণ ফাংশনের মতোই, যা fn কিওয়ার্ড দিয়ে শুরু হয়। কিন্তু মূল পার্থক্য হলো, মেথড সবসময় একটি Struct-এর ভেতর ডিফাইন করা হয়।
-
ফাংশন: এটি স্বাধীনভাবে যেকোনো জায়গায় থাকতে পারে।
-
মেথড: এটি একটি নির্দিষ্ট জিনিসের (Struct) ভেতরে থাকে এবং সেই জিনিসের ডাটা নিয়ে কাজ করে।
সহজ কথায়: ফাংশন হলো একটি সাধারণ কাজ, আর মেথড হলো কোনো নির্দিষ্ট বস্তুর নিজস্ব কাজ। যেমন: "খাওয়া" একটি কাজ (ফাংশন), কিন্তু "বিড়ালের খাওয়া" হলো বিড়ালের একটি মেথড।
কঠিন শব্দের ব্যাখ্যা: * Context (কনটেক্সট): মানে হলো পরিপ্রেক্ষিত বা কার অধীনে আছে। এখানে মেথড Struct-এর অধীনে থাকে।
২. impl ব্লক এবং মেথড তৈরি করা
মেথড তৈরি করতে হলে আমাদের impl (Implementation) ব্লক ব্যবহার করতে হয়।
ভিডিও রেফারেন্স: [01:21]
কোড উদাহরণ: ```rust struct Rectangle { width: u32, height: u32, }
impl Rectangle { // এটি একটি মেথড fn calculate_area(&self) -> u32 { self.width * self.height } }
কোড ব্যাখ্যা: এখানে impl Rectangle ব্লকের ভেতরে আমরা calculate_area নামে একটি মেথড বানিয়েছি। এটি Rectangle-এর ক্ষেত্রফল বের করে দেয়।
**সহজভাবে `&self` কী?** মেথডের প্রথম প্যারামিটার সবসময় `self` হয়। এটি দিয়ে প্রোগ্রাম বুঝতে পারে যে আমরা ঠিক কোন Rectangle-এর কথা বলছি। যদি আমাদের কাছে দুটি রেক্ট্যাঙ্গেল থাকে, তবে `self` বর্তমান রেক্ট্যাঙ্গেলের ডাটা (width, height) ব্যবহার করবে।
---
### ৩. একাধিক প্যারামিটার সহ মেথড
মেথড শুধু নিজের ডাটা নয়, বাইরে থেকেও ডাটা বা অন্য কোনো Struct নিতে পারে।
**ভিডিও রেফারেন্স:** [[09:41](http://www.youtube.com/watch?v=-PIjo-ebX-o&t=581)]
**কোড উদাহরণ:** ```rust
impl Rectangle {
fn can_hold(&self, other: &Rectangle) -> bool {
self.width > other.width && self.height > other.height
}
}
কোড ব্যাখ্যা: এখানে can_hold মেথডটি চেক করছে যে একটি রেক্ট্যাঙ্গেল কি অন্য একটি রেক্ট্যাঙ্গেলকে নিজের ভেতরে জায়গা দিতে পারবে কি না। এটি নিজের self ডাটার সাথে অন্য একটি রেক্ট্যাঙ্গেলের (other) ডাটা তুলনা করছে।
৪. এসোসিয়েটেড ফাংশন (Associated Functions)
এমন কিছু ফাংশন আছে যেগুলো Struct-এর ভেতরে থাকে কিন্তু self ব্যবহার করে না। এদের মেথড না বলে এসোসিয়েটেড ফাংশন বলা হয়।
ভিডিও রেফারেন্স: [12:19]
বিস্তারিত আলোচনা: এগুলো সাধারণত নতুন কোনো অবজেক্ট তৈরি করতে ব্যবহৃত হয় (যাকে কনস্ট্রাক্টর বলা হয়)। যেমন Rust-এর String::from("hello") এখানে from হলো একটি এসোসিয়েটেড ফাংশন।
সহজ কথায়: মেথড কল করতে object.method() লিখতে হয়, কিন্তু এসোসিয়েটেড ফাংশন কল করতে StructName::function() লিখতে হয় (ডাবল কোলন :: ব্যবহার করে)।
কঠিন শব্দের ব্যাখ্যা: * Static Function (স্ট্যাটিক ফাংশন): অন্যান্য প্রোগ্রামিং ভাষায় একে স্ট্যাটিক ফাংশন বলে, যা কোনো নির্দিষ্ট বস্তুর ওপর নির্ভর করে না, বরং পুরো ক্লাসের বা টাইপের ওপর নির্ভর করে।
আমার বিশ্লেষণ ও চিন্তা
এই ভিডিও থেকে বোঝা যায় যে কোডকে সুন্দরভাবে সাজানোর জন্য impl ব্লক কতটা জরুরি।
বাস্তব প্রেক্ষাপট ও সম্ভাবনা: ১. অর্গানাইজেশন: আপনার কোড যদি এলোমেলো ফাংশনে ভরা থাকে, তবে তা পড়া কঠিন। Struct এবং Method ব্যবহার করলে কোড অনেক বেশি পরিষ্কার এবং পেশাদার মনে হয়।
২. পাবলিক বনাম প্রাইভেট: ভিডিওতে ইঙ্গিত দেওয়া হয়েছে যে ভবিষ্যতে আমরা দেখব কীভাবে মেথড ব্যবহার করে ডাটাকে সুরক্ষিত রাখা যায় (Getters and Setters)।
পরামর্শ: আপনি যদি বিগিনার হন, তবে শুধু ফাংশন না লিখে Rust-এ সবসময় ছোট ছোট Struct বানিয়ে তার জন্য impl ব্লক লেখার অভ্যাস করুন। এটি আপনার লজিককে ডাটার সাথে যুক্ত রাখতে সাহায্য করবে।
বিকল্প চিন্তা: অনেক সময় আমরা একই কাজের জন্য অনেকগুলো impl ব্লক ব্যবহার করতে পারি, যা Rust সাপোর্ট করে। তবে বড় প্রজেক্টে সব মেথড এক জায়গায় না রেখে লজিক অনুযায়ী আলাদা আলাদা ব্লকে রাখলে কোড মেনটেইন করা সহজ হয়।
সবশেষে, ডাটা এবং কাজকে আলাদা না রেখে একসাথে গুছিয়ে রাখাই হলো এই ভিডিওর মূল শিক্ষা। [18:20]
[
Method Syntax | Rust Book
Piyush Garg · 2.9K views
](http://www.youtube.com/watch?v=-PIjo-ebX-o)

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