یکی از نقاط قوت Rust، ساختاردهی منظم و ماژولار کدهاست. در این بخش با مفاهیم ماژولها، سطح دسترسی (pub/private)، فایل Cargo.toml، crates، و نحوهی وارد کردن کدها با use آشنا میشویم؛ مهارتهایی حیاتی برای ساخت پروژههای بزرگ و سازمانیافته در Rust.
در Rust، ماژولها ابزار اصلی برای سازماندهی کد هستند. هر ماژول میتواند شامل توابع، ساختارها، enumها، و سایر ماژولها باشد.
تعریف ماژول درون یک فایل:
mod greetings {pub fn say_hello() {println!("سلام!");}}fn main() {greetings::say_hello();}
- با استفاده از mod ماژول تعریف میشود.
- دسترسی به محتوای آن با نام_ماژول::نام_تابع انجام میشود.
تقسیم ماژول به فایل جداگانه:
فایلها خودشان به عنوان ماژول شناخته میشوند.
src/├── main.rs└── greetings.rs
در main.rs:
mod greetings;fn main() {greetings::say_hello();}
در greetings.rs:
pub fn say_hello() {println!("درود از فایل دیگر!");}
pub و privateدر Rust، تمامی اعضای ماژول بهصورت پیشفرض private هستند.
pub:
اگر بخواهیم تابع یا ساختاری از خارج ماژول قابل استفاده باشد، باید آن را pub کنیم:
mod math {pub fn sum(a: i32, b: i32) -> i32 {a + b}}
private (پیشفرض):
بدون pub، دسترسی از خارج ماژول به اعضا ممنوع است و در زمان کامپایل خطا میگیریم.
crate چیست؟
هر پروژهی Rust یک crate محسوب میشود — یعنی یک واحد کامپایل مستقل.
- اگر main.rs داشته باشد، یک crate اجرایی است.
- اگر lib.rs داشته باشد، یک crate کتابخانهای است.
فایل Cargo.toml:
مرکز تنظیمات پروژه Rust شماست.
[package]name = "my_project"version = "0.1.0"edition = "2021"[dependencies]rand = "0.8"
- بخش [dependencies] برای اضافه کردن کتابخانههای دیگر (crates).
- با cargo build یا cargo run این وابستگیها نصب و استفاده میشوند.
افزودن crate خارجی:
مثلاً برای استفاده از کتابخانهی rand:
1 - اضافه به Cargo.toml:
2 - rand = "0.8"
3 - استفاده در کد:
use rand::Rngfn main() {let num = rand::thread_rng().gen_range(1..10);println!("عدد تصادفی: {}", num);}
useبرای استفاده راحتتر از توابع یا ساختارهای ماژولها، میتوانیم از دستور use استفاده کنیم.
بدون use:
math::sum(1, 2);
با use:
use math::sum;sum(1, 2);
همچنین میتوانیم از as برای تغییر نام یا از * برای وارد کردن همهچیز استفاده کنیم (توصیه نمیشود):
use math::sum as add;
در پروژههای بزرگ، ساختار درختی ماژولها بسیار معمول است:
src/├── main.rs└── utils/├── mod.rs└── math.rs
در این ساختار:
- utils/mod.rs به عنوان ماژول utils عمل میکند.
- داخل mod.rs: mod math;
- در main.rs: mod utils; use utils::math::sum;
در این بخش یاد گرفتیم:
- چگونه ماژولها را تعریف و از آنها در فایلهای جداگانه استفاده کنیم.
- تفاوت بین سطح دسترسیهای pub و private.
- چگونه با استفاده از Crates و فایل Cargo.toml پروژه را مدیریت و از کتابخانهها استفاده کنیم.
- و چگونه با use و ساختاردهی صحیح، کدها را خواناتر و قابلمدیریتتر کنیم.
در بخش بعدی، وارد دنیای Traits و Genericها خواهیم شد که بخش مهمی از برنامهنویسی پیشرفته در Rust هستند.