0Pricing
Learn Rust Coding · درس

حجب الأسماء

إعادة ربط المتغيرات

حجب الأسماء درس مجاني في Learn Rust Coding على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Learn Rust Coding، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Learn Rust Coding 4 دروس في المجموع.

What Is Shadowing?

التظليل (Shadowing) يعني الإعلان عن متغير جديد بنفس اسم متغير سابق. الارتباط الجديد 'يظلل' القديم.

تقوم بذلك عن طريق تكرار let بنفس الاسم.

fn main() {
    let x = 5;
    let x = x + 1;
    let x = x * 2;
    println!("x is {}", x);
}

Shadowing Is Not Mutation

يعمل التظليل (Shadowing) على إنشاء متغير جديد تماماً، وهذا يختلف عن mut، التي تعيد استخدام المتغير نفسه.

ولأن كل let تمثل ارتباطاً (binding) جديداً، يمكن للقيم أن تكون ذات أنواع مختلفة.

fn main() {
    let y = 10;        // immutable
    let y = y + 5;     // new binding, also immutable
    println!("y is {}", y);
}

Changing Types with Shadowing

من الاستخدامات القوية للظلال (shadowing) إعادة استخدام اسم مع تغيير نوعه.

هنا، يتم تحليل سلسلة نصية وتحويلها إلى رقم تحت نفس الاسم.

fn main() {
    let spaces = "   ";
    let spaces = spaces.len();
    println!("count is {}", spaces);
}

Why mut Cannot Change Type

با استخدام mut يمكنك تغيير القيمة ولكن ليس النوع.

هذا الكود سيفشل في التجميع (Compile):

  • let mut spaces = " ";
  • spaces = spaces.len(); — خطأ في عدم توافق النوع.

تجنب التظليل (Shadowing) هذا الأمر لأنه ينشئ متغيراً جديداً.

fn main() {
    let mut count = 3;
    count = 4; // ok, same type
    println!("{}", count);
}

Shadowing in Inner Scopes

يمكن حجب المتغير داخل كتلة برمجية داخلية. وعند انتهاء هذه الكتلة، يصبح الارتباط الخارجي مرئياً مرة أخرى.

fn main() {
    let n = 1;
    {
        let n = n * 10;
        println!("inner {}", n);
    }
    println!("outer {}", n);
}

Transforming Step by Step

تسمح لك خاصية التظليل (Shadowing) بتحويل القيمة عبر عدة خطوات مع الاحتفاظ باسم واحد واضح لها.

fn main() {
    let input = "42";
    let input: i32 = input.trim().parse().unwrap();
    let input = input * 2;
    println!("result {}", input);
}

Shadowing Keeps Immutability

يبقى كل ربط مُظلل غير قابل للتغيير. بعد إجراء التحويل، تحافظ على ميزة الأمان التي يوفرها عدم القابلية للتغيير دون الحاجة لابتكار أسماء جديدة مثل x2 أو x_temp.

fn main() {
    let price = 100;
    let price = price - 20;   // discount applied
    let price = price + 5;    // shipping added
    println!("final price {}", price);
}

Shadowing with Different Logic

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

fn main() {
    let text = "hello";
    let text = text.to_uppercase();
    println!("{}", text);
}

Avoiding Confusion

يعد التظليل (Shadowing) مفيدًا، لكن الإفراط في استخدامه قد يربك القراء. استخدمه عندما تكون كل خطوة تحولاً واضحاً للمفهوم نفسه، وليس لمجرد إعادة تدوير الأسماء بشكل عشوائي.

fn main() {
    let raw = "  Rust  ";
    let raw = raw.trim();      // clean version
    println!("[{}]", raw);
}

Shadowing vs Reassignment Summary

طريقتان لإعطاء اسم قيمة جديدة:

  • التظليل (Shadowing): استخدام let x = ...; مجددًا — متغير جديد، يمكن تغيير نوعه، ويظل غير قابل للتغيير (immutable).
  • إعادة التعيين (Reassignment): استخدام x = ...; مع mut — نفس المتغير، ويُشترط بقاء نفس النوع.
fn main() {
    let val = "7";
    let val: i32 = val.parse().unwrap(); // shadow + type change
    let mut val = val;
    val += 1;                            // reassign, same type
    println!("{}", val);
}

A Practical Example

تُعد قراءة بيانات المستخدم وتحويلها مجالاً كلاسيكياً لاستخدام الظلال (shadowing): احتفظ بالاسم ذا المعنى age بينما يتغير النوع من نص إلى رقم.

fn main() {
    let age = "25";
    let age: u32 = age.parse().unwrap();
    let age = age + 1; // next birthday
    println!("next year you will be {}", age);
}

Quick Check

حدد ما الذي يميز التظليل (shadowing) عن استخدام mut.

Recap

التظليل (Shadowing) في لغة Rust:

  • كرر let باستخدام نفس الاسم لإنشاء رابط جديد (binding).
  • يمكن أن يكون للرابط الجديد نوع مختلف.
  • تظل كل قيمة مظللة غير قابلة للتغيير (immutable).
  • يختلف هذا عن mut، الذي يقوم بتعديل نفس المتغير ويحافظ على نوعه.
fn main() {
    let data = "100";
    let data: i32 = data.parse().unwrap();
    let data = data / 4;
    println!("final {}", data);
}

الأسئلة الشائعة

هل درس «حجب الأسماء» مجاني؟

نعم — نص درس «حجب الأسماء» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Learn Rust Coding، انتقل إلى CoddyKit PRO. تتضمن دورة Learn Rust Coding 4 دروس في المجموع.

ماذا ستتعلم في «حجب الأسماء»؟

إعادة ربط المتغيرات تتمرن على Learn Rust Coding مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Learn Rust Coding؟

لا تُشترط خبرة سابقة. Learn Rust Coding على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «حجب الأسماء»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Learn Rust Coding هذا؟

نعم. كل درس في Learn Rust Coding يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. let وقابلية التغيير
  2. الأنواع العددية
  3. الأنواع المركبة
  4. حجب الأسماء
← العودة إلى Learn Rust Coding