0Pricing
Learn Rust Coding · درس

Enums مع البيانات

أرفق قيمًا بالمتغيرات

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

يمكن للمتغيرات حمل البيانات

كانت متغيراتنا حتى الآن مجرد أسماء. لكن يمكن للمتغير في Rust أيضًا أن يحمل بيانات داخل الأقواس.

يتيح ذلك لتعداد واحد وصف نوع القيمة والقيمة نفسها.

enum Message {
    Quit,
    Move(i32, i32),
    Write(String),
}

متغير بقيمة واحدة

ضع نوعًا بين قوسين لإرفاق جزء واحد من البيانات بمتغير.

يعني Celsius(f64) هنا أن المتغير Celsius يحتوي على رقم من النوع f64. وتقدم هذا الرقم عند إنشاء القيمة.

enum Temperature {
    Celsius(f64),
    Fahrenheit(f64),
}

fn main() {
    let t = Temperature::Celsius(21.5);
    println!("Created a temperature");
}

متغيرات بقيم متعددة

يمكن للمتغير أن يحتوي على عدة قيم تفصل بينها فواصل.

يخزن Move(i32, i32) عددين صحيحين، ربما إحداثي x وإحداثي y. وتمرر القيمتين عند إنشائه.

enum Shape {
    Circle(f64),
    Rectangle(f64, f64),
}

fn main() {
    let r = Shape::Rectangle(3.0, 4.0);
    println!("Made a rectangle");
}

استخراج البيانات باستخدام match

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

يربط Shape::Circle(r) هنا نصف القطر المخزّن بالمتغير r.

enum Shape {
    Circle(f64),
    Rectangle(f64, f64),
}

fn main() {
    let s = Shape::Circle(2.0);
    match s {
        Shape::Circle(r) => println!("radius {}", r),
        Shape::Rectangle(w, h) => println!("{} x {}", w, h),
    }
}

استخدام القيم المرتبطة

بعد ربط البيانات باسم، يمكنك إجراء العمليات عليها كما تفعل مع أي متغير.

يطابق هذا البرنامج شكلًا ويحسب مساحته، ثم يعيد النتيجة من match.

enum Shape {
    Circle(f64),
    Rectangle(f64, f64),
}

fn main() {
    let s = Shape::Rectangle(3.0, 4.0);
    let area = match s {
        Shape::Circle(r) => 3.14 * r * r,
        Shape::Rectangle(w, h) => w * h,
    };
    println!("area = {}", area);
}

بيانات مختلفة لكل متغير

يمكن لكل متغير أن يحتوي على شكل مختلف من البيانات، وقد لا يحتوي بعضها على أي بيانات.

هذه المرونة هي ما يجعل التعدادات معبّرة جدًا: إذ يمثّل نوع واحد حالات متعددة ومختلفة.

enum Message {
    Quit,
    Move(i32, i32),
    Write(String),
}

متغيرات شبيهة بالبنى

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

تنشئه بتسمية كل حقل، وتطابقه بالطريقة نفسها.

enum Event {
    Click { x: i32, y: i32 },
    KeyPress(char),
}

fn main() {
    let e = Event::Click { x: 10, y: 20 };
    match e {
        Event::Click { x, y } => println!("click at {},{}", x, y),
        Event::KeyPress(c) => println!("key {}", c),
    }
}

السلاسل النصية في المتغيرات

يمكن للمتغيرات أن تحتوي على بيانات مملوكة مثل String. وتمنحك المطابقة إمكانية الوصول إلى النص.

ملاحظة: تؤدي المطابقة حسب القيمة إلى نقل البيانات إلى الخارج، وهذا مناسب هنا لأننا نستخدمها فورًا.

enum Message {
    Write(String),
    Quit,
}

fn main() {
    let m = Message::Write(String::from("hello"));
    match m {
        Message::Write(text) => println!("text: {}", text),
        Message::Quit => println!("bye"),
    }
}

تعداد Option القياسي

إن Option<T> المضمّن في Rust هو تعداد يحتوي على بيانات: إذ يحمل Some(T) قيمة، بينما لا يحمل None شيئًا.

هذه هي طريقة Rust لتمثيل «قيمة قد تكون موجودة» من دون استخدام null. وتطابقه كما تطابق تعدادك الخاص.

fn main() {
    let maybe: Option<i32> = Some(5);
    match maybe {
        Some(n) => println!("got {}", n),
        None => println!("nothing"),
    }
}

تجميع العناصر معًا

يمثّل هذا البرنامج الكامل درجات الحرارة، ثم يحوّل قراءة مئوية إلى فهرنهايت داخل match.

جرّب تغيير المتغير أو قيمته، ثم شغّل البرنامج مرة أخرى.

enum Temperature {
    Celsius(f64),
    Fahrenheit(f64),
}

fn main() {
    let t = Temperature::Celsius(25.0);
    let f = match t {
        Temperature::Celsius(c) => c * 9.0 / 5.0 + 32.0,
        Temperature::Fahrenheit(f) => f,
    };
    println!("{} F", f);
}

متى تستخدم متغيرات تحمل بيانات

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

  • يحتاج Circle إلى نصف قطر.
  • تحتاج رسالة Write إلى نصها.
  • يحتاج Move إلى إحداثيات.

يؤدي تجميع البيانات مع المتغير إلى إبقاء المعلومات المرتبطة معًا، مع ضمان سلامة الأنواع.

تحقق سريع

تحقق من فهمك للتعدادات التي تحمل بيانات.

مراجعة

تعلمت أن متغيرات التعداد يمكن أن تحمل بيانات: قيمة واحدة، أو عدة قيم، أو حقولًا مسماة شبيهة بالبنى، أو لا شيء على الإطلاق.

تقرأ تلك البيانات بتسميتها في نمط match، مثل Circle(r). ويعمل النوع القياسي Option بالطريقة نفسها. ستتعلم لاحقًا تحسين المطابقات باستخدام الحراس والربط.

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

هل درس «Enums مع البيانات» مجاني؟

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

ماذا ستتعلم في «Enums مع البيانات»؟

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

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

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

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

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

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

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

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

  1. تعريف أول enum لك
  2. مطابقة متغيرات enum
  3. Enums مع البيانات
  4. حراس match والربط
← العودة إلى Learn Rust Coding