0Pricing
Learn Rust Coding · درس

let وقابلية التغيير

الربط والتغيير

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

Binding Values with let

في لغة Rust، تقوم بإنشاء متغير باستخدام الكلمة المفتاحية let. هذا الإجراء يقوم بـ ربط اسم بقيمة معينة.

بشكل افتراضي، يكون كل ربط غير قابل للتغيير (immutable) — بمجرد إعطائه قيمة، لا يمكنك تغييرها.

fn main() {
    let x = 5;
    println!("The value of x is: {}", x);
}

Immutable by Default

تجعل لغة Rust المتغيرات غير قابلة للتغيير بشكل متعمد. وهذا يمنع التغييرات غير المقصودة ويجعل فهم الكود أسهل.

تؤدي محاولة إعادة تعيين رابط غير قابل للتغيير إلى حدوث خطأ في الترجمة (compile error)، وليس انهيارًا أثناء التشغيل.

  • let x = 5; ثم x = 6; لن يتم تجميعها (compile).
fn main() {
    let x = 5;
    // x = 6; // this would cause a compile error
    println!("x stays {}", x);
}

Making Variables Mutable

عندما تحتاج إلى تغيير قيمة، أضف الكلمة المفتاحية mut. هذا يحدد الرابط على أنه قابل للتغيير.

الآن يمكنك إعادة تعيينها عدة مرات كما تشاء.

fn main() {
    let mut count = 0;
    count = count + 1;
    count += 1;
    println!("count is {}", count);
}

Type Inference

عادةً ما تكتشف لغة Rust نوع المتغير من قيمته. يُطلق على هذا اسم استنتاج النوع (type inference).

تُعطي التعليمة let x = 5; المتغير x النوع i32 تلقائياً.

fn main() {
    let n = 42;      // inferred as i32
    let pi = 3.14;   // inferred as f64
    println!("{} and {}", n, pi);
}

Type Annotations

يمكنك أيضاً تحديد النوع بشكل صريح باستخدام نقطتين متبوعتين باسم النوع. يُعرف هذا بـ تنويه النوع.

تُعد التنويهات مفيدة عندما لا يستطيع المترجم استنتاج النوع، أو من أجل الوضوح.

fn main() {
    let age: u32 = 30;
    let price: f64 = 9.99;
    println!("age {} price {}", age, price);
}

Constants

ثابت const غير قابل للتغيير دائمًا ويجب أن يحتوي على تعليق توضيحي للنوع. يجب أن تكون قيمته معروفة في وقت الترجمة.

حسب الاصطلاح، تستخدم الثوابت تنسيق SCREAMING_SNAKE_CASE.

fn main() {
    const MAX_POINTS: u32 = 100_000;
    println!("Max is {}", MAX_POINTS);
}

const vs let

الاختلافات الرئيسية بين const و let:

  • لا يمكن لـ const أن تكون mut أبداً.
  • تتطلب const تحديد نوع البيانات (type annotation).
  • يجب أن تكون const تعبيراً ثابتاً وقت الترجمة (compile-time constant).
  • يمكن حساب قيم let أثناء وقت التشغيل (runtime).
fn main() {
    const SECONDS_PER_HOUR: u32 = 60 * 60;
    let hours = 3;
    println!("{} seconds", SECONDS_PER_HOUR * hours);
}

Mutating in a Loop

المتغيرات القابلة للتعديل شائعة في الحلقات التكرارية حيث تتراكم القيمة بمرور الوقت.

هنا نقوم بجمع الأرقام باستخدام مجمع من النوع mut.

fn main() {
    let mut total = 0;
    for i in 1..=5 {
        total += i;
    }
    println!("Sum is {}", total);
}

Underscore for Unused

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

  • يخبر let _unused = 10; المترجم أن هذا الأمر مقصود.
fn main() {
    let _temp = 99;
    let used = 1;
    println!("{}", used);
}

Multiple Bindings

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

كل رابط مستقل وغير قابل للتغيير ما لم يتم تمييزه بـ mut.

fn main() {
    let name = "Rust";
    let year = 2010;
    let mut version = 1;
    version += 1;
    println!("{} born {} v{}", name, year, version);
}

Why Immutability Helps

تعد خاصية عدم القابلية للتغيير (Immutability) ميزة أمان. فعندما يعرف المترجم أن القيمة لا يمكن أن تتغير، فإنه يستطيع تقديم ضمانات أقوى ومنع فئات كاملة من الأخطاء البرمجية.

لا تستخدم التغيير (mutation) عبر الكلمة المفتاحية mut إلا عند الحاجة الفعلية لذلك.

fn main() {
    let config = "production";
    // config is guaranteed not to change
    println!("Running in {}", config);
}

Quick Check

ما هي الكلمة المفتاحية التي تجعل متغير Rust قابلاً للتغيير؟

Recap

لقد تعلمت أساسيات الربط (bindings) في لغة Rust:

  • يقوم let بربط اسم بقيمة، وهو غير قابل للتغيير افتراضيًا.
  • يجعل mut الربط قابلاً للتغيير.
  • تستنتج Rust الأنواع تلقائيًا، ولكن يمكنك إضافة توضيحات للأنواع باستخدام :.
  • يُستخدم const للقيم التي يتم تحديدها في وقت الترجمة، وهو غير قابل للتغيير دائمًا، ويتطلب تحديد النوع.
fn main() {
    let mut score: u32 = 0;
    const BONUS: u32 = 10;
    score += BONUS;
    println!("Final score: {}", score);
}

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

هل درس «let وقابلية التغيير» مجاني؟

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

ماذا ستتعلم في «let وقابلية التغيير»؟

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

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

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

كم من الوقت يستغرق درس «let وقابلية التغيير»؟

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

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

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

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

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