الوصول إلى القيم
جزء من قسم Logic & Flow في رحلة Rust على Coddy — الدرس 30 من 66.
بمجرد أن يكون لديك بيانات مخزنة في hash map الخاصة بك، ستحتاج إلى طريقة لاسترجاعها. تسمح لك الطريقة .get() بالبحث عن قيمة باستخدام مفتاحها:
let value = my_map.get("some_key");ومع ذلك، هناك تفصيل مهم يجب فهمه: لا تعيد .get() القيمة مباشرة. بدلاً من ذلك، تعيد نوع Option — وهو نوع مدمج في لغة Rust يمثل إما "شيئاً ما" أو "لا شيء". هذا لأن المفتاح الذي تبحث عنه قد لا يكون موجوداً في الـ 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 تتعامل تلقائيًا مع المرجع (reference) نيابة عنك في هذا السياق — لا يزال capital يحتفظ بمرجع للقيمة، لكنك لست بحاجة لكتابة & بشكل صريح في النمط. مطابقة الأنماط في Rust ذكية بما يكفي لتسمح لك باستخدام capital مباشرة، على سبيل المثال عند طباعته.
يمنع هذا التصميم برنامجك من الانهيار عندما تحاول الوصول إلى مفتاح غير موجود. فبدلاً من التسبب في حدوث خطأ، تجبرك لغة Rust على التعامل مع كلا الاحتمالين - العثور على القيمة أو عدم العثور عليها - مما يجعل الكود الخاص بك أكثر قوة وقابلية للتنبؤ.
التحدي
سهلستتلقى مدخلين: اسم دولة واسم عاصمة. قم بإنشاء hash map تخزن أسماء الدول كمفاتيح (من نوع String) وعواصمها كقيم (من نوع String). أدخل الدولة وعاصمتها في الـ hash map. بعد ذلك، ستتلقى مدخلاً ثالثاً يحتوي على اسم دولة أخرى للبحث عنها. استخدم طريقة .get() لاسترداد العاصمة لهذه الدولة وتعامل مع كلتا الحالتين: عندما تكون الدولة موجودة في الخريطة وعندما لا تكون موجودة.
ملاحظة: تعيد .get() نوع Option — إما Some(&value) (مرجع للقيمة) عندما يكون المفتاح موجوداً، أو None عندما لا يكون موجوداً. في ذراع match، يمكنك كتابة Some(capital) وسيقوم Rust تلقائياً بالتعامل مع المرجع نيابة عنك، لذا يمكنك استخدام capital مباشرة في جملة الطباعة الخاصة بك.
المتطلبات:
- استورد
HashMapمنstd::collections - أنشئ hash map قابلة للتعديل (mutable) بأنواع
HashMap<String, String> - اقرأ المدخل الأول كاسم للدولة
- اقرأ المدخل الثاني كاسم للعاصمة
- أدخل الدولة والعاصمة في الـ hash map
- اقرأ المدخل الثالث كالدولة المراد البحث عنها
- استخدم
.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
جرّب بنفسك
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، وأدرج الدولة والعاصمة، ثم ابحث عن الدولة
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1تدفق التحكم المتقدم
تعبير 'match'مطابقة قيم متعددةمطابقة النطاقاتتعبير 'if let'الحلقات التكرارية كتعبيراتمراجعة - محلل أوامر بسيط4تجميع البيانات باستخدام Structs
ما هو الـ Struct؟نظرة عامة على الـ Structsالوصول إلى حقول الـ Structالـ Structs القابلة للتعديلالـ Structs كمعاملات للدوالالـ Tuple Structsمراجعة - إنشاء Book Struct7معالجة الأخطاء باستخدام 'Result'
ما هو 'Result'؟استخدام 'match' مع 'Result'is_ok() و is_err()اختصارات: unwrap و expectعامل علامة الاستفهام '?'تحويل السلاسل النصية إلى أرقامملخص - دالة القسمة الآمنة10الـ Closures والدوال المجهولة
ما هو الـ Closure؟تعريف Closure بسيطالـ Closures مع المعاملاتالتقاط البيئة المحيطةملخص - Closure الجامع البسيط2مقدمة في الـ Vectors
ما هو الـ Vector؟إنشاء Vectorإضافة عناصر باستخدام pushالوصول إلى عناصر الـ Vectorالتكرار عبر الـ Vectorالتكرار القابل للتعديل (Mutable Iteration)إزالة العناصرمراجعة - متتبع نقاط بسيط5أزواج (المفتاح والقيمة) مع Hash Maps
ما هو Hash Map؟إنشاء Hash Mapإدراج أزواج (المفتاح والقيمة)الوصول إلى القيمالتكرار عبر Hash Mapتحديث قيمةإزالة زوجملخص - عداد الكلمات6التعامل مع غياب القيم باستخدام 'Option'
ما هو الـ 'Option'؟استخدام 'match' مع 'Option''is_some()' و 'is_none()'فك تغليف الـ 'Option'الدالة 'expect'توفير قيمة افتراضية: 'unwrap_or'مراجعة - البحث عن عنصر9شرائح الـ String والمزيد
String مقابل &strإنشاء شرائح الـ Stringالشرائح كمعاملات للدوالشرائح أخرىمراجعة - إيجاد الكلمة الأولى