اطمینان حاصل کنید که پروژه های Rust شما به خوبی سازماندهی شده اند تا در طول زمان نگهداری آنها آسان تر باشد.
زنگ یک انتخاب عالی برای ساخت برنامه های پیچیده و قابل اعتماد است. یکی از مهارتهای ضروری برای توسعه برنامههای Rust، ساختاردهی مؤثر پروژههای شما، از جمله ترکیب بستههای شخص ثالث است.
سازماندهی پروژه موثر برای توسعه برنامه های Rust بسیار مهم است. برنامههای Rust با ساختار مناسب، همکاری و ادغام آسان برنامههای شخص ثالث را افزایش میدهند و زمان و تلاش مورد نیاز برای توسعه برنامه را به میزان قابل توجهی کاهش میدهند. Rust یک مدیر بسته داخلی و ابزارهای دیگر را برای سازماندهی و مدیریت کد موثر فراهم می کند.
راه اندازی پروژه های Rust
هنگامی که Rust را روی دستگاه خود نصب کردید، راه اندازی پروژه های Rust آسان است. می توانید از Cargo (مدیر بسته داخلی و سیستم ساخت Rust) برای ایجاد و پیکربندی پروژه Rust استفاده کنید. شبیه به سایر مدیران بسته مانند npm برای Node.js و pip برای پایتون است. Cargo وابستگی ها را مدیریت می کند، کد را کامپایل می کند و مستندات را تولید می کند و آن را به ابزاری ضروری برای توسعه Rust تبدیل می کند.
این دستور را برای تأیید نصب Cargo خود اجرا کنید:
cargo --version
دستور نسخه بار نصب شده را نمایش می دهد.
می توانید با دستور cargo new یک پروژه Rust جدید ایجاد کنید. شما باید نام پروژه را مشخص کنید.
cargo new my_project
این دستور یک دایرکتوری جدید در دایرکتوری فعلی ایجاد می کند که حاوی فایل های اصلی مورد نیاز پروژه Rust شما است، از جمله یک فایل cargo.toml برای مدیریت وابستگی های پروژه شما.
فضای نام بسته Rust
بسته ها و جعبه ها اجزای ضروری در Rust هستند. جعبهها کتابخانهها یا باینریهایی هستند که توسعهدهندگان Rust میتوانند از آنها استفاده کرده و برای برخی موارد خاص کامپایل کنند، و بستهها مجموعهای از جعبهها هستند. بسته ها معمولاً حاوی یک جعبه است که کد قابل استفاده مجدد را در خود نگه می دارد و یک باینری که یک CLI برای جعبه کتابخانه ارائه می دهد.
جعبهها باید حاوی فایل Cargo.toml حاوی فرادادههای مربوط به بسته، مانند نام، نسخه، وابستگیها و اسکریپتهای ساخت آن باشند.
بسته های Rust از یک قرارداد نامگذاری پیروی می کنند تا از تداخل نامگذاری بین بسته ها جلوگیری شود. نام بستهها باید منحصربهفرد، با حروف کوچک و فقط شامل حروف، ارقام و خط تیره باشند. اگر نام بسته حاوی چندین کلمه است، آنها را با خط فاصله جدا کنید، به عنوان مثال. هایپر سرور
میتوانید به کد داخل فضای نام بسته Rust با کلمه کلیدی use و سپس نام بسته و جعبه دسترسی داشته باشید.
در اینجا مثالی از وارد کردن یک تابع Rng از یک جعبه rand آورده شده است:
use rand::Rng;
می توانید چندین فضای نام برای بسته ها ایجاد کنید. هنگامی که یک پوشه ایجاد می کنید، فضای نام جدیدی ایجاد می کنید که می توانید با علامت نقطه به آن دسترسی داشته باشید تا مسیر شناسه را مشخص کنید.
در Rust، میتواند چندین فضای نام برای بستهها وجود داشته باشد. هنگامی که یک پوشه ایجاد می کنید، یک فضای نام جدید ایجاد می کنید. برای دسترسی به کد از فضای نام دیگر، از علامت نقطه برای تعیین مسیر شناسه استفاده می کنید.
در اینجا مثالی از دسترسی به یک تابع از یک فضای نام متفاوت آورده شده است:
// file in folder1 namespace
pub fn folder() -> u32 {
// some function body here
return 0;
}
// file in folder2 namespace
use folder1::folder;
pub fn directory() {
// accessing the folder function from the folder1 namespace
let folder_func = folder();
}
این برنامه دو ماژول Rust را در فضاهای نام مختلف به ترتیب folder1 و folder2 تعریف می کند. ماژول folder1 حاوی یک پوشه تابع عمومی است که یک مقدار صحیح بدون علامت 32 بیتی را برمی گرداند.
ماژول folder2 تابع پوشه را از فضای نام folder1 با کلمه کلیدی use وارد می کند و به تابع دایرکتوری اجازه می دهد از ماژول folder1 به تابع پوشه دسترسی پیدا کند. تابع دایرکتوری تابع folder را فراخوانی می کند و مقدار بازگشتی به متغیر folder_func اختصاص می یابد.
برای صادرات باید نام شناسهها را از یک بسته یا جعبه بزرگ بنویسید. هنگامی که یک شناسه را صادر می کنید، آن را در بسته های دیگری که از کد استفاده می کنند قابل دسترسی می کنید.
در اینجا نمونه ای از یک تابع عمومی است که می تواند صادر شود.
// function exported to other packages and crates
pub fn MyFunction() {
// some function body here
}
همچنین باید از کلمه کلیدی pub استفاده کنید. در Rust کلمه کلیدی pub کوتاه شده عمومی است. وقتی یک تابع، ساختار، enum، هر نوع داده یا ماژول Rust با کلمه کلیدی pub علامت گذاری می شود، خارج از ماژول آن قابل دسترسی می شود. مورد بدون کلمه کلیدی pub در ماژول خود خصوصی است و فقط از داخل آن قابل دسترسی است.
تعریف ماژول ها برای کنترل دامنه و حریم خصوصی
می توانید از ماژول ها برای کنترل دامنه و حریم خصوصی در برنامه های Rust استفاده کنید. ماژول ها به شما این امکان را می دهند که کد را در واحدهای منطقی سازماندهی کنید که مدیریت و نگهداری آنها آسان تر است.
شما می توانید ماژول ها را با کلمه کلیدی mod و به دنبال آن نام ماژول و بریس های فرفری اعلام کنید. تعریف یک ماژول جدید یک فضای نام جدید برای محتویات آن ایجاد می کند، به این معنی که توابع، ساختارها یا سایر موارد تعریف شده در ماژول فقط در داخل ماژول قابل دسترسی هستند مگر اینکه شما به طور صریح آنها را صادر کنید.
ماژولها به جلوگیری از تضاد نامگذاری کمک میکنند و درک کد را بصریتر میکنند.
در اینجا نحو یک ماژول ساده آمده است:
mod my_module {
// module contents go here
}
در ماژول می توانید متغیرها، توابع، ساختارها، enums و انواع دیگر را تعریف کنید.
mod my_module {
fn add_numbers(a: i32, b: i32) -> i32 {
a + b
}
}
می توانید از کلمه کلیدی pub برای صادرات تابع و دسترسی به تابع در قسمت های دیگر برنامه استفاده کنید.
mod my_module {
pub fn add_numbers(a: i32, b: i32) -> i32 {
a + b
}
}
اکنون می توانید تابع add_numbers را از قسمت های دیگر برنامه خود فراخوانی کنید.
همچنین می توانید حریم خصوصی ماژول ها را با کلمه کلیدی pub در تعاریف ماژول کنترل کنید.
pub mod my_module {
pub fn add_numbers(a: i32, b: i32) -> i32 {
a + b
}
}
اکنون ماژول my_module عمومی است و می توانید از ماژول های دیگر به ماژول دسترسی داشته باشید.
اگر نیاز دارید که یک ماژول یا مورد را برای یک ماژول خاص یا مجموعه ای از ماژول ها در دسترس قرار دهید، می توانید از کلمه کلیدی pub(crate) استفاده کنید. کلمه کلیدی pub(crate) مورد را از ماژول های داخل جعبه قابل دسترسی می کند اما از ماژول های موجود در جعبه های دیگر قابل دسترسی نیست.
mod my_module {
pub struct MyStruct {
pub(crate) some_field: u32,
}
}
اکنون می توانید به آیتم خاص (در این مورد، فیلد some_field ساختار MyStruct) در قسمت های دیگر برنامه خود دسترسی داشته باشید.
fn main() {
let my_struct = my_module::MyStruct { some_field: 42 };
println!("{}", my_struct.some_field);
}
متغیر my_struct نمونه ای از ساختار MyStruct است. متغیر با جداکننده مسیر (::) به ساختار دسترسی پیدا می کند. تابع main فیلد some_field ساختار را با println چاپ می کند! کلان.
مدل مالکیت Rust ایمنی حافظه را تضمین می کند
سازماندهی کد Rust یکی از راههای اطمینان از حفظ و پشتیبانی کد شما در طول زمان است. مقابله با اشکالات و اطمینان از ایمنی در کدهای سازماندهی شده که از قوانین و کنوانسیون های جامعه Rust پیروی می کند آسان تر است.
در حالت پیشفرض، Rust تضمین میکند که برنامهها با یک مدل مالکیت داخلی ایمن هستند. مدل مالکیت با اطمینان از اینکه متغیرهای حافظه دارای یک مالک منحصر به فرد هستند، ایمنی حافظه را تضمین می کند. مدل مالکیت از ردیابی داده ها و بسیاری از انواع خطاهای حافظه جلوگیری می کند.