۴
مالکیت (Ownership)
مهمترین و منحصر به فردترین مفهوم Rust که اون رو امن میکنه!
قوانین مالکیت
سیستم مالکیت Rust خیلی سادهست و فقط سه تا قانون داره:
- هر مقدار در Rust یک "مالک" (Owner) داره که یک متغیره.
- در هر لحظه، فقط و فقط یک مالک میتونه وجود داشته باشه.
- وقتی مالک از محدوده (Scope) خارج میشه، مقدار هم حذف (Drop) میشه.
این قوانین در زمان کامپایل چک میشن و به Rust اجازه میدن حافظه رو بدون نیاز به Garbage Collector مدیریت کنه.
fn main() {
let s1 = String::from("hello");
let s2 = s1; // مالکیت از s1 به s2 منتقل (Move) میشه
// println!("{}, world!", s1); // این خط خطا میده! چون s1 دیگه مالک نیست
println!("{}, world!", s2); // این درسته
} // اینجا s2 از محدوده خارج و حافظه آزاد میشه
قرض گرفتن (Borrowing) و ارجاعها (References)
اگه نخوایم مالکیت رو کامل منتقل کنیم چی؟ میتونیم یه مقدار رو به یه تابع "قرض" بدیم. به این کار Borrowing میگن و با استفاده از Referenceها (`&`) انجام میشه.
fn main() {
let s1 = String::from("hello");
// ما s1 رو به تابع قرض میدیم، نه اینکه مالکیتش رو منتقل کنیم
let len = calculate_length(&s1);
println!("The length of '{}' is {}.", s1, len); // s1 هنوز معتبره!
}
fn calculate_length(s: &String) -> usize {
s.len()
} // اینجا s از محدوده خارج میشه، ولی چون مالک نیست، چیزی حذف نمیشه
دو نوع قرض گرفتن داریم: **immutable borrow (`&T`)** که فقط اجازه خوندن میده و **mutable borrow (`&mut T`)** که اجازه تغییر هم میده.