0Pricing
Learn Rust Coding · درس

إنشاء HashMap

أدرج العناصر وابحث عنها باستخدام المفتاح

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

ما هي HashMap؟

تخزن HashMap البيانات على هيئة أزواج من المفتاح والقيمة. وتبحث عن العناصر باستخدام المفتاح بدلًا من الفهرس.

فكر في دليل هاتف: يربط الاسم (المفتاح) برقم (القيمة). وتناسب HashMaps الحالات التي تحتاج فيها إلى بحث سريع باستخدام مفتاح ذي معنى.

استيراد HashMap

بخلاف Vec وString، لا توجد HashMap ضمن prelude. يجب إدخالها إلى النطاق.

أضف سطر use في أعلى ملفك. يتيح ذلك استخدام الاسم في الوحدة بأكملها.

use std::collections::HashMap;

fn main() {
    let scores: HashMap<String, i32> = HashMap::new();
    println!("empty map len: {}", scores.len());
}

إدراج أزواج

استخدم insert لإضافة مفتاح وقيمته. إذا كان المفتاح موجودًا مسبقًا، تُستبدل القيمة القديمة.

يجب التصريح عن الخريطة باستخدام mut للسماح بالإدراج.

use std::collections::HashMap;

fn main() {
    let mut scores = HashMap::new();
    scores.insert("Alice", 50);
    scores.insert("Bob", 30);
    println!("{} players", scores.len());
}

استنتاج النوع

نادرًا ما تحتاج إلى كتابة النوع بنفسك. يستنتج Rust النوع HashMap<&str, i32> من استدعاءات insert الأولى.

المفاتيح هنا شرائح نصية والقيم أعداد صحيحة، ويُحدَّد كلاهما من خلال الاستخدام.

use std::collections::HashMap;

fn main() {
    let mut ages = HashMap::new();
    ages.insert("Sam", 28);
    ages.insert("Mia", 34);
    println!("Sam is {}", ages["Sam"]);
}

الحصول على القيم

تُرجع الطريقة get قيمة من النوع Option. تحصل على Some(&value) إذا كان المفتاح موجودًا، أو على None إذا لم يكن موجودًا.

يجبرك ذلك على معالجة حالة عدم العثور على المفتاح بأمان.

use std::collections::HashMap;

fn main() {
    let mut scores = HashMap::new();
    scores.insert("Alice", 50);
    match scores.get("Alice") {
        Some(v) => println!("score: {}", v),
        None => println!("no score"),
    }
}

الفهرسة مقابل get

يمكنك استخدام الفهرسة بصيغة map[key]، لكنها تتسبب في panic إذا كان المفتاح مفقودًا.

فضّل استخدام get عندما يكون من المحتمل ألا يكون المفتاح موجودًا. استخدم الفهرسة فقط عندما تكون متأكدًا من وجوده.

use std::collections::HashMap;

fn main() {
    let mut m = HashMap::new();
    m.insert("x", 1);
    // m["y"] would panic!
    let v = m.get("y").copied().unwrap_or(0);
    println!("y = {}", v);
}

تحديث قيمة

يؤدي استدعاء insert باستخدام مفتاح موجود إلى استبدال القيمة القديمة.

تُعاد القيمة السابقة (ضمن Option) لتتمكنوا من فحصها إذا أردتم.

use std::collections::HashMap;

fn main() {
    let mut m = HashMap::new();
    m.insert("k", 1);
    let old = m.insert("k", 9);
    println!("old = {:?}, now = {}", old, m["k"]);
}

التحقق من المفاتيح

استخدموا contains_key لاختبار وجود مفتاح من دون استرداد قيمته.

تعيد هذه الدالة قيمة bool عادية، وهذا مفيد في شروط if.

use std::collections::HashMap;

fn main() {
    let mut m = HashMap::new();
    m.insert("on", true);
    if m.contains_key("on") {
        println!("key exists");
    }
}

إزالة العناصر

تحذف الدالة remove مفتاحًا وتعيد قيمته على هيئة Option.

إذا لم يكن المفتاح موجودًا، فستحصلون على None، لذلك تكون الإزالة آمنة دائمًا.

use std::collections::HashMap;

fn main() {
    let mut m = HashMap::new();
    m.insert("a", 1);
    let removed = m.remove("a");
    println!("removed {:?}, len {}", removed, m.len());
}

التكرار على الخريطة

تعيد حلقة for على HashMap كائنات (key, value) المرجعية على هيئة أزواج.

لاحظوا أن الترتيب غير محدد وقد يتغير بين عمليات التشغيل، لأن التجزئة توزع العناصر عشوائيًا.

use std::collections::HashMap;

fn main() {
    let mut m = HashMap::new();
    m.insert("a", 1);
    m.insert("b", 2);
    for (k, v) in &m {
        println!("{} -> {}", k, v);
    }
}

ملكية المفاتيح

عند إدراج قيم مملوكة مثل String، تتولى الخريطة ملكيتها.

بعد الإدراج، لا يمكنكم استخدام ذلك المتغير مجددًا إلا إذا استنسختموه أولًا.

use std::collections::HashMap;

fn main() {
    let mut m = HashMap::new();
    let name = String::from("Alice");
    m.insert(name, 50);
    // name is moved here; m owns it now
    println!("{}", m["Alice"]);
}

تحقق سريع

تريدون قيمة، لكن قد يكون المفتاح مفقودًا.

مراجعة

تعلمتم إنشاء HashMap وإدراج الأزواج والبحث عن القيم باستخدام get أو الفهرسة.

ورأيتم أيضًا contains_key وremove والتكرار، وكيف تتولى الخريطة ملكية المفاتيح المدرجة.

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

هل درس «إنشاء HashMap» مجاني؟

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

ماذا ستتعلم في «إنشاء HashMap»؟

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

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

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

كم من الوقت يستغرق درس «إنشاء HashMap»؟

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

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

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

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

  1. إنشاء HashMap
  2. واجهة Entry والقيم الافتراضية
  3. العمل مع HashSet
  4. العدّ والتجميع
← العودة إلى Learn Rust Coding