মডিউলগুলোকে বিভিন্ন ফাইলে বিভক্ত করা
এখন পর্যন্ত, এই অধ্যায়ের সমস্ত উদাহরণে একটি ফাইলের মধ্যেই একাধিক মডিউল ডিফাইন করা হয়েছে। যখন মডিউলগুলো বড় হয়ে যায়, তখন কোড নেভিগেট করা সহজ করার জন্য আপনি তাদের ডেফিনিশনগুলোকে একটি পৃথক ফাইলে সরাতে চাইতে পারেন।
উদাহরণস্বরূপ, চলুন Listing 7-17-এর কোড থেকে শুরু করি যেখানে একাধিক রেস্তোরাঁ মডিউল ছিল। আমরা সব মডিউল ক্রেট রুট ফাইলে ডিফাইন না করে, মডিউলগুলোকে আলাদা ফাইলে এক্সট্র্যাক্ট করব। এই ক্ষেত্রে, ক্রেট রুট ফাইলটি হলো src/lib.rs, কিন্তু এই পদ্ধতিটি বাইনারি ক্রেটের ক্ষেত্রেও কাজ করে যার ক্রেট রুট ফাইল হলো src/main.rs।
প্রথমে আমরা front_of_house
মডিউলটিকে তার নিজস্ব ফাইলে এক্সট্র্যাক্ট করব। front_of_house
মডিউলের জন্য কোঁকড়া বন্ধনীর (curly brackets) ভিতরের কোডটি সরিয়ে ফেলুন, শুধুমাত্র mod front_of_house;
ডিক্লেয়ারেশনটি রেখে দিন, যাতে src/lib.rs ফাইলে Listing 7-21-এ দেখানো কোডটি থাকে। মনে রাখবেন, যতক্ষণ না আমরা Listing 7-22-এ src/front_of_house.rs ফাইলটি তৈরি করছি, ততক্ষণ এটি কম্পাইল হবে না।
mod front_of_house;
pub use crate::front_of_house::hosting;
pub fn eat_at_restaurant() {
hosting::add_to_waitlist();
}
এরপর, কোঁকড়া বন্ধনীর মধ্যে যে কোডটি ছিল, সেটি src/front_of_house.rs নামের একটি নতুন ফাইলে রাখুন, যেমনটি Listing 7-22-এ দেখানো হয়েছে। কম্পাইলার জানে যে এই ফাইলটিতে কোড খুঁজতে হবে কারণ এটি ক্রেট রুটে front_of_house
নামের মডিউল ডিক্লেয়ারেশনটি পেয়েছে।
pub mod hosting {
pub fn add_to_waitlist() {}
}```
</Listing>
মনে রাখবেন যে আপনার মডিউল ট্রি-তে একটি `mod` ডিক্লেয়ারেশন ব্যবহার করে একটি ফাইল শুধুমাত্র _একবারই_ লোড করতে হবে। একবার কম্পাইলার জেনে গেলে যে ফাইলটি প্রজেক্টের অংশ (এবং `mod` স্টেটমেন্টটি কোথায় রেখেছেন তার উপর ভিত্তি করে মডিউল ট্রি-তে কোডটি কোথায় অবস্থিত তা জানে), আপনার প্রজেক্টের অন্যান্য ফাইলগুলোকে লোড করা ফাইলের কোডটি তার ডিক্লেয়ার করা পাথ ব্যবহার করে রেফার করা উচিত, যা [“মডিউল ট্রি-তে কোনো আইটেম রেফার করার জন্য পাথ”][paths]<!-- ignore --> বিভাগে আলোচনা করা হয়েছে। অন্য কথায়, `mod` একটি “include” অপারেশন _নয়_ যা আপনি অন্যান্য প্রোগ্রামিং ভাষায় দেখে থাকতে পারেন।
এর পরে, আমরা `hosting` মডিউলটিকে তার নিজস্ব ফাইলে এক্সট্র্যাক্ট করব। প্রক্রিয়াটি কিছুটা ভিন্ন কারণ `hosting` হলো `front_of_house`-এর একটি চাইল্ড মডিউল, রুট মডিউলের নয়। আমরা `hosting`-এর জন্য ফাইলটিকে একটি নতুন ডিরেক্টরিতে রাখব যার নাম হবে মডিউল ট্রি-তে তার পূর্বপুরুষদের নামে, এই ক্ষেত্রে _src/front_of_house_।
`hosting` সরানো শুরু করতে, আমরা _src/front_of_house.rs_ পরিবর্তন করে শুধুমাত্র `hosting` মডিউলের ডিক্লেয়ারেশনটি রাখব:
<Listing file-name="src/front_of_house.rs">
```rust,ignore
pub mod hosting;
তারপর আমরা একটি src/front_of_house ডিরেক্টরি এবং একটি hosting.rs ফাইল তৈরি করব যাতে hosting
মডিউলে করা ডেফিনিশনগুলো থাকবে:
pub fn add_to_waitlist() {}
যদি আমরা এর পরিবর্তে hosting.rs ফাইলটি src ডিরেক্টরিতে রাখতাম, কম্পাইলার আশা করত যে hosting.rs কোডটি ক্রেট রুটে ডিক্লেয়ার করা একটি hosting
মডিউলে থাকবে, এবং front_of_house
মডিউলের চাইল্ড হিসাবে ডিক্লেয়ার করা হবে না। কোন মডিউলের কোডের জন্য কোন ফাইলগুলো পরীক্ষা করতে হবে সে সম্পর্কে কম্পাইলারের নিয়মগুলোর মানে হলো ডিরেক্টরি এবং ফাইলগুলো মডিউল ট্রি-এর সাথে আরও ঘনিষ্ঠভাবে মিলে যায়।
বিকল্প ফাইল পাথ
এখন পর্যন্ত আমরা সবচেয়ে প্রচলিত ফাইল পাথগুলো কভার করেছি যা রাস্ট কম্পাইলার ব্যবহার করে, কিন্তু রাস্ট একটি পুরানো স্টাইলের ফাইল পাথও সাপোর্ট করে। ক্রেট রুটে ডিক্লেয়ার করা
front_of_house
নামের একটি মডিউলের জন্য, কম্পাইলার মডিউলের কোডটি খুঁজবে:
- src/front_of_house.rs (যা আমরা কভার করেছি)
- src/front_of_house/mod.rs (পুরানো স্টাইল, এখনও সমর্থিত পাথ)
front_of_house
-এর একটি সাবমডিউলhosting
-এর জন্য, কম্পাইলার মডিউলের কোড খুঁজবে:
- src/front_of_house/hosting.rs (যা আমরা কভার করেছি)
- src/front_of_house/hosting/mod.rs (পুরানো স্টাইল, এখনও সমর্থিত পাথ)
আপনি যদি একই মডিউলের জন্য উভয় স্টাইল ব্যবহার করেন, আপনি একটি কম্পাইলার এরর পাবেন। একই প্রজেক্টে বিভিন্ন মডিউলের জন্য উভয় স্টাইলের মিশ্রণ ব্যবহার করা অনুমোদিত, কিন্তু এটি আপনার প্রজেক্ট নেভিগেট করা লোকেদের জন্য বিভ্রান্তিকর হতে পারে।
mod.rs নামের ফাইল ব্যবহার করার স্টাইলের প্রধান অসুবিধা হলো আপনার প্রজেক্টে অনেকগুলো mod.rs নামের ফাইল তৈরি হতে পারে, যা আপনার এডিটরে একই সময়ে খোলা থাকলে বিভ্রান্তিকর হতে পারে।
আমরা প্রতিটি মডিউলের কোড একটি পৃথক ফাইলে সরিয়েছি, এবং মডিউল ট্রি একই রয়েছে। eat_at_restaurant
-এর ফাংশন কলগুলো কোনো পরিবর্তন ছাড়াই কাজ করবে, যদিও ডেফিনিশনগুলো বিভিন্ন ফাইলে রয়েছে। এই কৌশলটি আপনাকে মডিউলগুলো আকারে বড় হওয়ার সাথে সাথে নতুন ফাইলে স্থানান্তর করতে দেয়।
মনে রাখবেন যে src/lib.rs-এর pub use crate::front_of_house::hosting
স্টেটমেন্টটিও পরিবর্তিত হয়নি, এবং use
-এর ক্রেটের অংশ হিসাবে কোন ফাইলগুলো কম্পাইল করা হয় তার উপর কোনো প্রভাব নেই। mod
কীওয়ার্ড মডিউল ডিক্লেয়ার করে, এবং রাস্ট সেই মডিউলে থাকা কোডের জন্য মডিউলের নামের সাথে মিলিয়ে একটি ফাইল খোঁজে।
সারসংক্ষেপ
রাস্ট আপনাকে একটি প্যাকেজকে একাধিক ক্রেটে এবং একটি ক্রেটকে একাধিক মডিউলে বিভক্ত করতে দেয় যাতে আপনি এক মডিউলে ডিফাইন করা আইটেম অন্য মডিউল থেকে রেফার করতে পারেন। আপনি অ্যাবসোলিউট বা রিলেটিভ পাথ নির্দিষ্ট করে এটি করতে পারেন। এই পাথগুলো একটি use
স্টেটমেন্টের মাধ্যমে স্কোপে আনা যেতে পারে যাতে আপনি সেই স্কোপে আইটেমটির একাধিক ব্যবহারের জন্য একটি ছোট পাথ ব্যবহার করতে পারেন। মডিউল কোড ডিফল্টরূপে প্রাইভেট থাকে, কিন্তু আপনি pub
কীওয়ার্ড যোগ করে ডেফিনিশনগুলোকে পাবলিক করতে পারেন।
পরবর্তী অধ্যায়ে, আমরা স্ট্যান্ডার্ড লাইব্রেরির কিছু কালেকশন ডেটা স্ট্রাকচার দেখব যা আপনি আপনার সুন্দরভাবে সাজানো কোডে ব্যবহার করতে পারবেন।