الوصول إلى القيم
جزء من قسم المنطق وتدفّق التنفيذ في رحلة Rust على Coddy. الدرس 30 من 66.
بمجرد تخزين البيانات في خريطة التجزئة، ستحتاج إلى طريقة لاستردادها. تتيح لك الطريقة .get() البحث عن قيمة باستخدام مفتاحها:
let value = my_map.get("some_key");ومع ذلك، هناك تفصيل مهم يجب فهمه: لا تُرجع .get() القيمة مباشرةً. بل تُرجع نوع Option: وهو نوع مضمّن في Rust يمثّل إمّا «شيئًا» أو «لا شيء». ويرجع ذلك إلى أن المفتاح الذي تبحث عنه قد لا يكون موجودًا في خريطة التجزئة.
عندما يكون المفتاح موجودًا، تُرجع .get() القيمة Some(&value) - لاحظ رمز &، الذي يعني أنك تحصل على مرجع إلى القيمة، وليس على القيمة نفسها. وعندما لا يكون المفتاح موجودًا، تُرجع None:
match capitals.get("France") {
Some(capital) => println!("The capital is {}", capital),
None => println!("Country not found"),
}قد تلاحظ أن ذراع match يستخدم Some(capital) دون وجود & صريح. يحدث هذا لأن Rust تتعامل تلقائيًا مع المرجع نيابةً عنك في هذا السياق: لا يزال capital يحتفظ بمرجع إلى القيمة، لكنك لا تحتاج إلى كتابة & صراحةً في النمط. تتميز مطابقة الأنماط في Rust بالذكاء الكافي للسماح لك باستخدام capital مباشرةً، مثلًا عند طباعته.
يمنع هذا التصميم برنامجك من التعطّل عند محاولة الوصول إلى مفتاح غير موجود. وبدلًا من التسبب في خطأ، تُلزمك Rust بالتعامل مع الاحتمالين — العثور على القيمة أو عدم العثور عليها — مما يجعل شيفرتك أكثر متانة وقابلية للتنبؤ.
التحدي
سهلستتلقى مُدخلين: اسم country واسم capital city. أنشئ hash map يخزّن أسماء country كمفاتيح (من النوع String) وعواصمها كقيم (من النوع String). أدخل country وعاصمتها في hash map. بعد ذلك، ستتلقى مُدخلًا ثالثًا يتضمن اسم country آخر للبحث عنه. استخدم الطريقة .get() لاسترداد capital لهذا البلد وتعامل مع كلتا الحالتين: عندما يكون country موجودًا في map وعندما لا يكون موجودًا.
ملاحظة: تُرجع .get() قيمة من النوع Option، إما Some(&value) (مرجعًا إلى القيمة) عندما يكون المفتاح موجودًا، أو None عندما لا يكون موجودًا. في ذراع match، يمكنك كتابة Some(capital)، وسيتولى Rust تلقائيًا التعامل مع المرجع نيابةً عنك، لذا يمكنك استخدام capital مباشرةً في جملة الطباعة.
المتطلبات:
- استورد
HashMapمنstd::collections - أنشئ hash map قابلاً للتغيير بالنوع
HashMap<String, String> - اقرأ المُدخل الأول باعتباره اسم country
- اقرأ المُدخل الثاني باعتباره اسم capital city
- أدخل country وcapital في hash map
- اقرأ المُدخل الثالث باعتباره country المطلوب البحث عنه
- استخدم
.get()لاسترداد capital الخاصة بـ country المطلوب البحث عنه - استخدم
matchللتعامل معOptionالتي تُرجعها.get() - إذا تم العثور على country، اطبع:
The capital of [country] is [capital] - إذا لم يتم العثور على country، اطبع:
[country] not found in the map
الإدخال:
- السطر الأول: اسم Country المراد إدخاله (مثلًا:
France) - السطر الثاني: اسم capital city (مثلًا:
Paris) - السطر الثالث: اسم Country المطلوب البحث عنه (مثلًا:
FranceأوGermany)
الإخراج:
- إذا كان country المطلوب البحث عنه موجودًا:
The capital of [country] is [capital] - إذا لم يكن country المطلوب البحث عنه موجودًا:
[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، أدرج الدولة والعاصمة، ثم ابحث عن الدولة
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق وتدفّق التنفيذ
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الشرائح كمعاملات للدوالشرائح أخرىمراجعة - إيجاد الكلمة الأولىتدرّب بنفسك: مترجم Rust عبر الإنترنت