الانتقال إلى المحتوى الرئيسي
الوحدة 1 · الدرس 1 من 21/14 في الدورة~10 min
دروس الوحدة (1/2)

المتغيرات والتقلب

في Rust، يتم توجيه إدارة المتغيرات والذاكرة بمبدأين أساسيين: السلامة و التحكم. لهذا السبب، على عكس العديد من لغات البرمجة الأخرى، تكون المتغيرات في Rust غير قابلة للتغيير افتراضيًا.

وهذا يعني أنه بمجرد تعيين قيمة لمتغير، لا يمكن تغييرها. إذا حاولت تعديله، سيثير المترجم خطأ.

المتغيرات غير القابلة للتغيير والكلمة الرئيسية mut

للإعلان عن متغير، نستخدم الكلمة الأساسية let:

Rust
let x = 5; // Immutable by default
// x = 6; // ERROR! The compiler will refuse to build this code.

إذا كنت بحاجة إلى تعديل قيمة متغير، فيجب عليك جعله قابلاً للتغيير بشكل صريح باستخدام الكلمة الأساسية mut مباشرة بعد let:

Rust
let mut y = 10; // Mutable
println!("Il valore di y e: {}", y);
y = 15; // Valid!
println!("Il valore modificato di y e: {}", y);

يؤدي استخدام البادئة mut إلى التواصل بوضوح مع المترجم وأي شخص يقرأ الكود بأن القيمة ستتغير أثناء التنفيذ.

التظليل

يسمح الصدأ أيضًا بمفهوم التظليل، وهو إعادة تعريف متغير يحمل نفس الاسم باستخدام الكلمة الأساسية let مرة أخرى. المتغير الجديد "الظلال" (أو يغطي) المتغير السابق:

Rust
let x = 5;
let x = x + 1; // Shadowing: x is now 6
let x = x * 2; // Shadowing: x is now 12

على عكس mut، يتيح لك التظليل ما يلي:

  1. قم بتغيير نوع بيانات المتغير مع الاحتفاظ بنفس الاسم.
  2. الحفاظ على ثبات المتغير بعد التحولات.
Rust
let spaces = "   "; // Type: &str (string)
let spaces = spaces.len(); // Type: usize (number)

فائدة التظليل والنطاقات

لا يقتصر التظليل على نفس الكتلة؛ يمكن استخدامه داخل الكتل المتداخلة ({}) لتجاوز القيمة مؤقتًا. عندما تنتهي الكتلة الداخلية، يصبح المتغير الأصلي مرئيًا مرة أخرى:

Rust
let x = 5;
{
    let x = x * 2; // Shadowing valid only inside the block
    println!("Value in the inner block: {}", x); // Prints 10
}
println!("Value in the outer block: {}", x); // Prints 5

هذه الآلية آمنة وفعالة للغاية لأنها تحدث بالكامل في وقت الترجمة، مما يضمن سلامة النوع دون أي نفقات إضافية على الأداء في وقت التشغيل.


جربه بنفسك

تمرين#rust.m1.l1.e1
المحاولات: 0جارٍ التحميل…

قم بتعريف متغير قابل للتغيير اسمه x بقيمة أولية 5. بعد ذلك، أضف 10 إلى x واطبعه على الشاشة باستخدام println! ماكرو.

جارٍ تحميل المحرر…
إظهار التلميح

قم بتعريف المتغير باستخدام `let mut x = 5;`، ثم قم بزيادته باستخدام `x += 10;` (أو `x = x + 10;`) وأخيرًا اطبعه باستخدام `println!('{}', x);`.

الحل متاح بعد 3 من المحاولات

تمرين#rust.m1.l1.e2
المحاولات: 0جارٍ التحميل…

قم بتعريف متغير غير قابل للتغيير y بقيمة 10. قم بتظليل y من خلال الإعلان عنه مرة أخرى باستخدام Let لضرب قيمته السابقة في 2، وأخيرًا طباعته باستخدام println!.

جارٍ تحميل المحرر…
إظهار التلميح

Use `let y = 10;`, then shadow it by declaring it again with `let y = y * 2;` and finally use `println!` to display it.

الحل متاح بعد 3 من المحاولات

تمرين#rust.m1.l1.e3
المحاولات: 0جارٍ التحميل…

Declare an immutable variable named input containing the string value "42". Shadow input by declaring it as an integer of type i32, converting the original value via input.parse::<i32>().unwrap(). Finally, print it using the println! macro.

جارٍ تحميل المحرر…
إظهار التلميح

Declare `let input = "42";`, then shadow it with `let input: i32 = input.parse().unwrap();` and print it using `println!("{}", input);`.

الحل متاح بعد 3 من المحاولات