Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

الوصول إلى القيم

جزء من قسم Logic & Flow في رحلة Rust على Coddy — الدرس 30 من 66.

بمجرد أن يكون لديك بيانات مخزنة في hash map الخاص بك، ستحتاج إلى طريقة لاستعادتها. تسمح لك الطريقة .get() بالبحث عن قيمة باستخدام مفتاحها:

let value = my_map.get("some_key");

ومع ذلك، هناك تفصيل مهم يجب فهمه: لا يقوم .get() بإرجاع القيمة مباشرة. بدلاً من ذلك، فإنه يعيد نوع Option — وهو نوع مدمج في لغة Rust يمثل إما وجود قيمة (Some) أو غيابها (None). وذلك لأن المفتاح الذي تبحث عنه قد لا يكون موجوداً في الـ hash map.

عندما يكون المفتاح موجوداً، تعيد الدالة .get() القيمة Some(&value) - لاحظ الرمز &، مما يعني أنك تحصل على مرجع (reference) للقيمة. عندما لا يكون المفتاح موجوداً، فإنها تعيد None:

match capitals.get("France") {
    Some(capital) => println!("The capital is {}", capital),
    None => println!("Country not found"),
}

في ذراع المطابقة (match arm) الخاص بـ Some(capital)، تتعامل لغة Rust مع المرجع تلقائياً نيابة عنك — capital هنا مرتبط بالقيمة المرجعية الداخلية، لذا لا تحتاج إلى كتابة & بشكل صريح في النمط (pattern).

هذا التصميم يمنع برنامجك من الانهيار عندما تحاول الوصول إلى مفتاح غير موجود. فبدلاً من التسبب في خطأ، تجبرك Rust على التعامل مع كلا الاحتمالين - العثور على القيمة أو عدم العثور عليها - مما يجعل الكود الخاص بك أكثر قوة وقابلية للتنبؤ.

challenge icon

التحدي

سهل

ستتلقى مدخلين: اسم دولة واسم عاصمة. قم بإنشاء خريطة تجزئة (hash map) تخزن أسماء الدول كمفاتيح (من نوع String) وعواصمها كقيم (من نوع String). أدخل الدولة وعاصمتها في خريطة التجزئة. بعد ذلك، ستتلقى مدخلاً ثالثاً يحتوي على اسم دولة أخرى للبحث عنها. استخدم التابع .get() لاسترداد العاصمة لهذه الدولة وتعامل مع كلتا الحالتين: عندما تكون الدولة موجودة في الخريطة وعندما لا تكون موجودة.

ملاحظة: التابع .get() يعيد Option — إما Some(&value) (مرجع للقيمة) عندما يكون المفتاح موجوداً، أو None عندما لا يكون موجوداً. في ذراع match، يمكنك كتابة Some(capital) وسيقوم Rust تلقائياً بالتعامل مع المرجع نيابة عنك، لذا يمكنك استخدام capital مباشرة في جملة الطباعة الخاصة بك.

المتطلبات:

  • استيراد HashMap من std::collections
  • إنشاء خريطة تجزئة قابلة للتعديل (mutable) بأنواع HashMap<String, String>
  • قراءة المدخل الأول كاسم للدولة
  • قراءة المدخل الثاني كاسم للعاصمة
  • إدراج الدولة والعاصمة في خريطة التجزئة
  • قراءة المدخل الثالث كالدولة المراد البحث عنها
  • استخدام .get() لاسترداد العاصمة للدولة المراد البحث عنها
  • استخدام match للتعامل مع الـ Option الذي يعيده .get()
  • إذا تم العثور على الدولة، اطبع: The capital of [country] is [capital]
  • إذا لم يتم العثور على الدولة، اطبع: [country] not found in the map

المدخلات:

  • السطر الأول: اسم الدولة المراد إدراجها (على سبيل المثال، France)
  • السطر الثاني: اسم العاصمة (على سبيل المثال، Paris)
  • السطر الثالث: اسم الدولة المراد البحث عنها (على سبيل المثال، France أو Germany)

المخرجات:

  • إذا كانت الدولة المبحوث عنها موجودة: The capital of [country] is [capital]
  • إذا كانت الدولة المبحوث عنها غير موجودة: [country] not found in the map

ورقة مرجعية

تسترجع الطريقة .get() قيمة من خريطة التجزئة (hash map) باستخدام مفتاحها:

let value = my_map.get("some_key");

تعيد الطريقة .get() نوع Option لأن المفتاح قد لا يكون موجوداً في خريطة التجزئة:

  • عندما يكون المفتاح موجوداً: تعيد Some(&value) (مرجع للقيمة)
  • عندما لا يكون المفتاح موجوداً: تعيد None

استخدم match للتعامل مع كلتا الحالتين:

match capitals.get("France") {
    Some(capital) => println!("The capital is {}", capital),
    None => println!("Country not found"),
}

يمنع هذا التصميم حدوث أعطال (crashes) عند الوصول إلى مفاتيح غير موجودة من خلال إجبارك على التعامل مع كلا الاحتمالين.

جرّب بنفسك

use std::collections::HashMap;
use std::io;

fn main() {
    // قراءة اسم الدولة لإدراجها
    let mut country = String::new();
    io::stdin().read_line(&mut country).expect("Failed to read line");
    let country = country.trim().to_string();
    
    // قراءة اسم العاصمة
    let mut capital = String::new();
    io::stdin().read_line(&mut capital).expect("Failed to read line");
    let capital = capital.trim().to_string();
    
    // قراءة اسم الدولة للبحث عنها
    let mut lookup_country = String::new();
    io::stdin().read_line(&mut lookup_country).expect("Failed to read line");
    let lookup_country = lookup_country.trim().to_string();
    
    // TODO: اكتب كودك أدناه
    // قم بإنشاء HashMap، وأدرج الدولة والعاصمة، ثم ابحث عن الدولة
    
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Logic & Flow