0Pricing
Learn Rust Coding · درس

متجهات من Structs

خزّن بيانات معقدة في Vec

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

لماذا نستخدم متجهات من البنى؟

يمكن للمتجهات احتواء أي نوع واحد، بما في ذلك البنى التي تنشئها بنفسك. يخزن Vec<Person> العديد من الأشخاص بالترتيب، وهو مناسب لقوائم السجلات مثل المستخدمين أو العناصر أو النتائج.

يجمع ذلك بين أشكال البيانات المخصصة والقائمة القابلة للتوسيع.

تعريف بنية

عرّف أولًا البنية التي تريد تخزينها. تحتوي Person هنا على اسم وعمر.

يسمح السطر #[derive(Debug)] بطباعة شخص باستخدام {:?}، وهو مفيد لطباعة المتجهات كاملة.

#[derive(Debug)]
struct Person {
    name: String,
    age: u32,
}

إنشاء المتجه

أنشئ مثيلات من البنية، ثم اجمعها في ماكرو vec!. يصبح نوع المتجه Vec<Person> تلقائيًا.

استخدم {:?} لطباعة جميع السجلات دفعة واحدة.

#[derive(Debug)]
struct Person { name: String, age: u32 }

fn main() {
    let people = vec![
        Person { name: String::from("Ann"), age: 30 },
        Person { name: String::from("Bo"), age: 25 },
    ];
    println!("{:?}", people);
}

إضافة البنى باستخدام push

يمكنك أيضًا البدء بمتجه فارغ وإضافة البنى واحدة تلو الأخرى باستخدام push. يجب أن يكون المتجه mut حتى يمكن تكبيره.

يناسب هذا النمط الحالات التي تصل فيها السجلات بمرور الوقت، مثل البيانات التي يُدخلها المستخدم.

#[derive(Debug)]
struct Item { name: String }

fn main() {
    let mut cart = Vec::new();
    cart.push(Item { name: String::from("Pen") });
    cart.push(Item { name: String::from("Mug") });
    println!("{:?}", cart);
}

التكرار على السجلات

كرر على &people لقراءة كل بنية من دون امتلاكها. داخل الحلقة، تصل إلى الحقول باستخدام صيغة النقطة، مثل p.name.

يطبع ذلك سطرًا واضحًا لكل سجل.

#[derive(Debug)]
struct Person { name: String, age: u32 }

fn main() {
    let people = vec![
        Person { name: String::from("Ann"), age: 30 },
        Person { name: String::from("Bo"), age: 25 },
    ];
    for p in &people {
        println!("{} is {}", p.name, p.age);
    }
}

قراءة حقل واحد

استخدم الفهرس للوصول إلى بنية واحدة في المتجه، ثم استخدم صيغة النقطة للوصول إلى حقلها. لذلك تعطي people[0].name اسم الشخص الأول.

تذكر أن الفهارس تبدأ من 0، وأن الوصول خارج النطاق يؤدي إلى panic.

#[derive(Debug)]
struct Person { name: String, age: u32 }

fn main() {
    let people = vec![
        Person { name: String::from("Ann"), age: 30 },
    ];
    println!("name: {}", people[0].name);
}

تغيير حقل

لتعديل سجل، يجب أن يكون المتجه mut. ثم استخدم الفهرس للوصول إلى البنية وأسند قيمة إلى حقلها، مثل people[0].age = 31.

يحدّث ذلك البيانات المخزنة في موضعها.

struct Person { name: String, age: u32 }

fn main() {
    let mut people = vec![
        Person { name: String::from("Ann"), age: 30 },
    ];
    people[0].age = 31;
    println!("{}", people[0].age);
}

جمع حقل

يمكن لأدوات التكرار استخراج حقل واحد من كل سجل. يضيف iter().map(|p| p.age).sum() هنا جميع الأعمار.

تحول خطوة map كل شخص إلى عمر فقط قبل إجراء الجمع.

struct Person { name: String, age: u32 }

fn main() {
    let people = vec![
        Person { name: String::from("Ann"), age: 30 },
        Person { name: String::from("Bo"), age: 20 },
    ];
    let total: u32 = people.iter().map(|p| p.age).sum();
    println!("total age = {}", total);
}

تصفية السجلات

استخدم iter().filter(...) للإبقاء على السجلات التي تطابق قاعدة معينة. تُرجع دالة الإغلاق قيمة من النوع bool لكل بنية.

نحسب هنا عدد الأشخاص الذين تبلغ أعمارهم 30 عامًا على الأقل.

struct Person { name: String, age: u32 }

fn main() {
    let people = vec![
        Person { name: String::from("Ann"), age: 30 },
        Person { name: String::from("Bo"), age: 20 },
    ];
    let adults = people.iter().filter(|p| p.age >= 30).count();
    println!("adults: {}", adults);
}

الترتيب حسب حقل

رتب السجلات حسب حقل باستخدام sort_by_key. ومرر إليها دالة إغلاق تُرجع القيمة التي تريد الترتيب وفقًا لها، مثل العمر.

يجب أن يكون المتجه mut لأن الترتيب يعيد تنظيمه.

#[derive(Debug)]
struct Person { name: String, age: u32 }

fn main() {
    let mut people = vec![
        Person { name: String::from("Ann"), age: 30 },
        Person { name: String::from("Bo"), age: 20 },
    ];
    people.sort_by_key(|p| p.age);
    println!("{:?}", people);
}

عدّ السجلات

عدد البنى المخزنة هو ببساطة len()، كما هو الحال مع أي متجه. ويخبرك ذلك بعدد السجلات الموجودة حاليًا.

استخدمه مع is_empty() للتحقق قبل قراءة السجل الأول.

struct Item { name: String }

fn main() {
    let cart = vec![
        Item { name: String::from("Pen") },
        Item { name: String::from("Mug") },
    ];
    println!("items: {}", cart.len());
}

تحقق سريع

اختبر مدى فهمك لمتجهات البنى.

مراجعة

خزنت البنى في Vec، وأنشأته باستخدام vec! وpush، وقرأت الحقول أو عدّلتها حسب الفهرس وداخل الحلقات.

كما جمعت السجلات وصفيتها ورتبتها حسب حقل وعددتها. ويمكنك الآن إدارة قوائم البيانات المنظمة باستخدام المتجهات.

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

هل درس «متجهات من Structs» مجاني؟

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

ماذا ستتعلم في «متجهات من Structs»؟

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

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

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

كم من الوقت يستغرق درس «متجهات من Structs»؟

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

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

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

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

  1. إنشاء المتجهات وملؤها
  2. الفهرسة والتكرار
  3. التوسيع والتقليص
  4. متجهات من Structs
← العودة إلى Learn Rust Coding