مراجع مشتركة

المرجع (reference) يوفر طريقة للوصول إلى قيمة أخرى دون تحمل المسؤولية عن القيمة، ويُسمى أيضًا "الاستعارة" (borrowing). المراجع المشتركة (Shared references) هي للقراءة فقط، ولا يمكن تغيير البيانات المشار إليها.

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

المرجع المشترك (shared reference) لنوع T يكون من النوع &T. يتم إنشاء قيمة المرجع باستخدام المعامل &.·المعامل·*·يقوم·بـ·"إلغاء·المرجع"·(dereferences)·للمرجع،·مما·يعطي·قيمته.

سيمنع Rust بشكل ثابت المراجع المتدلية (dangling references):

fn x_axis(x: &i32) -> &(i32, i32) {
    let point = (*x, 0);
    return &point;
}
This slide should take about 10 minutes.
  • يُقال أن المرجع "يستعير" (borrow) القيمة التي يشير إليها، وهذا نموذج جيد للطلاب غير المألوفين بالمؤشرات (pointers): يمكن للكود استخدام المرجع للوصول إلى القيمة، ولكنها لا تزال "مملوكة" (owned) من قبل المتغير الأصلي. ستتناول الدورة مزيدًا من التفاصيل حول الملكية (ownership) في اليوم الثالث.

  • يتم تنفيذ المراجع (references) كمؤشرات (pointers)، وميزة رئيسية هي أنها يمكن أن تكون أصغر بكثير من الشيء الذي تشير إليه. الطلاب المألوفون بلغة C أو C++ سيتعرفون على المراجع (references) كمؤشرات (pointers). ستغطي الأجزاء اللاحقة من الدورة كيفية منع Rust أخطاء أمان الذاكرة (memory-safety bugs) التي تأتي من استخدام المؤشرات الخام (raw pointers).

  • لا يقوم Rust بإنشاء المراجع (references) تلقائيًا - المعامل & مطلوب دائمًا.

  • سيقوم Rust بإلغاء المرجع تلقائيًا (auto-dereference) في بعض الحالات، خاصة عند استدعاء الدوال (methods) (جرب r.is_ascii()). لا حاجة لمعامل -> كما في C++.

  • في هذا المثال، r قابل للتغيير (mutable) بحيث يمكن إعادة تعيينه (r = &b). لاحظ أن هذا يعيد ربط r، بحيث يشير إلى شيء آخر. هذا يختلف عن C++، حيث أن التعيين إلى مرجع يغير القيمة المشار إليها.

  • المرجع المشترك (shared reference) لا يسمح بتعديل القيمة التي يشير إليها، حتى لو كانت تلك القيمة قابلة للتغيير (mutable). جرب *r = 'X'.

  • يقوم Rust بتتبع أعمار (lifetimes) جميع المراجع لضمان أنها تعيش لفترة كافية. لا يمكن أن تحدث المراجع المتدلية (dangling references) في Rust الآمن. ستعيد x_axis مرجعًا إلى point، ولكن سيتم إلغاء تخصيص point عند انتهاء الدالة، لذلك لن يتم تجميع هذا الكود.

  • سنتحدث أكثر عن الاستعارة (borrowing) عندما نصل إلى الملكية (ownership).