مراجع اشتراکی

A reference provides a way to access another value without taking ownership of the value, and is also called "borrowing". Shared references are read-only, and the referenced data cannot change.

fn main() {
    let a = 'A';
    let b = 'B';
    let mut r: &char = &a;
    println!("r: {}", *r);
    r = &b;
    println!("r: {}", *r);
}

یک مرجع مشترک به یک نوع T دارای نوع &T است. یک مقدار مرجع با عملگر & ساخته می شود. عملگر * یک مرجع را "ارجاع مجدد" می کند و مقدار آن را به دست می دهد.

راست بطور استاتیک مراجع تعلیق شده (dangling) را ممنوع می‌کند:

fn x_axis(x: &i32) -> &(i32, i32) {
    let point = (*x, 0);
    return &point;
}
This slide should take about 10 minutes.
  • گفته می‌شود که یک مرجع مقداری را که به آن ارجاع می‌دهد "borrow" (قرض) می‌کند، و این مدل خوبی برای دانش‌آموزانی است که با اشاره‌گرها آشنا نیستند: کد می‌تواند از مرجع برای دسترسی به مقدار استفاده کند، اما همچنان متعلق به متغیر اصلی است. این دوره در روز 3 به جزئیات بیشتری در مورد مالکیت خواهد پرداخت.

  • مراجع به عنوان اشاره گر پیاده سازی می شوند و یک مزیت کلیدی این است که می توانند بسیار کوچکتر از چیزی باشند که به آن اشاره می کنند. دانش آموزانی که با C یا C++ آشنا هستند، مراجع را به عنوان اشاره گر تشخیص می دهند. بخش‌های بعدی دوره به این موضوع می‌پردازد که چگونه Rust از اشکالات ایمنی حافظه ناشی از استفاده از نشانگرهای خام جلوگیری می‌کند.

  • Rust به طور خودکار برای شما مراجع ایجاد نمی کند - & همیشه مورد نیاز است.

  • راست در برخی موارد به‌طور خودکار از Dereference می‌کند، به‌ویژه هنگام فراخوانی متدها ( ref_x.count_ones() را امتحان کنید).

  • در این مثال، r قابل تغییر است تا بتوان آن را مجدداً اختصاص داد (r = &b). توجه داشته باشید که این r را دوباره متصل می کند، به طوری که به چیز دیگری اشاره می کند. این با C++ متفاوت است، جایی که انتساب به یک مرجع مقدار مرجع را تغییر می دهد.

  • یک مرجع مشترک اجازه تغییر مقداری را که به آن ارجاع می دهد را نمی دهد، حتی اگر آن مقدار قابل تغییر باشد. "*r = "X" را امتحان کنید.

  • Rust طول عمر همه مراجع را ردیابی می کند تا اطمینان حاصل شود که آنها به اندازه کافی عمر می کنند. ارجاعات آویزان نمی توانند در Rust ایمن رخ دهند. x_axis یک ارجاع به point برمی‌گرداند، اما «نقطه» زمانی که تابع برمی‌گردد، تخصیص داده می‌شود، بنابراین کامپایل نمی‌شود.

  • هنگامی که به مالکیت در زبان راست رسیدیم، بیشتر در مورد «قرض دادن» صحبت خواهیم کرد.