۴

مالکیت (Ownership)

مهم‌ترین و منحصر به فردترین مفهوم Rust که اون رو امن می‌کنه!

قوانین مالکیت

سیستم مالکیت Rust خیلی ساده‌ست و فقط سه تا قانون داره:

  1. هر مقدار در Rust یک "مالک" (Owner) داره که یک متغیره.
  2. در هر لحظه، فقط و فقط یک مالک می‌تونه وجود داشته باشه.
  3. وقتی مالک از محدوده (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`)** که اجازه تغییر هم می‌ده.