دروس الوحدة (1/2)
المتغيرات والتقلب
في Rust، يتم توجيه إدارة المتغيرات والذاكرة بمبدأين أساسيين: السلامة و التحكم. لهذا السبب، على عكس العديد من لغات البرمجة الأخرى، تكون المتغيرات في Rust غير قابلة للتغيير افتراضيًا.
وهذا يعني أنه بمجرد تعيين قيمة لمتغير، لا يمكن تغييرها. إذا حاولت تعديله، سيثير المترجم خطأ.
المتغيرات غير القابلة للتغيير والكلمة الرئيسية mut
للإعلان عن متغير، نستخدم الكلمة الأساسية let:
let x = 5; // Immutable by default
// x = 6; // ERROR! The compiler will refuse to build this code.إذا كنت بحاجة إلى تعديل قيمة متغير، فيجب عليك جعله قابلاً للتغيير بشكل صريح باستخدام الكلمة الأساسية mut مباشرة بعد let:
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 مرة أخرى. المتغير الجديد "الظلال" (أو يغطي) المتغير السابق:
let x = 5;
let x = x + 1; // Shadowing: x is now 6
let x = x * 2; // Shadowing: x is now 12على عكس mut، يتيح لك التظليل ما يلي:
- قم بتغيير نوع بيانات المتغير مع الاحتفاظ بنفس الاسم.
- الحفاظ على ثبات المتغير بعد التحولات.
let spaces = " "; // Type: &str (string)
let spaces = spaces.len(); // Type: usize (number)فائدة التظليل والنطاقات
لا يقتصر التظليل على نفس الكتلة؛ يمكن استخدامه داخل الكتل المتداخلة ({}) لتجاوز القيمة مؤقتًا. عندما تنتهي الكتلة الداخلية، يصبح المتغير الأصلي مرئيًا مرة أخرى:
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هذه الآلية آمنة وفعالة للغاية لأنها تحدث بالكامل في وقت الترجمة، مما يضمن سلامة النوع دون أي نفقات إضافية على الأداء في وقت التشغيل.
جربه بنفسك
قم بتعريف متغير قابل للتغيير اسمه x بقيمة أولية 5. بعد ذلك، أضف 10 إلى x واطبعه على الشاشة باستخدام println! ماكرو.
إظهار التلميح
قم بتعريف المتغير باستخدام `let mut x = 5;`، ثم قم بزيادته باستخدام `x += 10;` (أو `x = x + 10;`) وأخيرًا اطبعه باستخدام `println!('{}', x);`.
الحل متاح بعد 3 من المحاولات
قم بتعريف متغير غير قابل للتغيير 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 من المحاولات
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 من المحاولات