نظرة عامة على الـ Structs
جزء من قسم Logic & Flow في رحلة Rust على Coddy — الدرس 21 من 66.
الآن بعد أن فهمت ما هي الـ structs، دعنا نتعلم كيفية إنشائها واستخدامها فعلياً. يتضمن ذلك خطوتين: أولاً تحديد هيكل الـ struct، ثم إنشاء مثيلات (instances) منه.
لتعريف هيكل (struct)، تستخدم الكلمة المفتاحية struct متبوعة باسم الهيكل وحقوله داخل أقواس معقوفة. كل حقل له اسم ونوع:
struct User {
username: String,
active: bool,
}يؤدي هذا إلى إنشاء مخطط لـ User struct يحتوي على حقلين: username من النوع String و active من النوع bool.
اصطلاح التسمية: يجب أن تستخدم أسماء الـ Struct في Rust نمط PascalCase (يسمى أيضاً UpperCamelCase)، مما يعني أن كل كلمة تبدأ بحرف كبير — على سبيل المثال، User، أو ProductItem، أو ShoppingCart. سيقوم Rust بتحذيرك إذا لم تتبع هذا الاصطلاح.
بمجرد قيامك بتعريف struct، يمكنك إنشاء مثيلات منه عن طريق تحديد قيم لكل حقل:
let user1 = User {
username: String::from("alice"),
active: true,
};لاحظ أنك تقوم بتوفير اسم الـ struct متبوعاً بأقواس معقوفة تحتوي على اسم كل حقل، ونقطتين رأسيتين، وقيمته. ليس من الضروري أن يتطابق ترتيب الحقول مع ترتيب التعريف.
للوصول إلى حقول مثيل الـ struct، استخدم تدوين النقطة (dot notation) — اكتب اسم المثيل متبوعًا بنقطة واسم الحقل:
println!("Username: {}", user1.username);
println!("Active: {}", user1.active);هنا، يصل user1.username إلى حقل username الخاص بـ user1، ويصل user1.active إلى حقل active. يمكنك استخدام قيم هذه الحقول في أي مكان تستخدم فيه متغيراً عادياً.
التحدي
سهلستتلقى ثلاثة مدخلات: اسم المنتج، والسعر (كعدد عشري)، وكمية المخزون (كعدد صحيح). قم بتعريف هيكل Product بثلاثة حقول: name من نوع String، و price من نوع f64، و stock من نوع i32. ثم قم بإنشاء مثيل لهذا الهيكل باستخدام قيم المدخلات واطبع معلومات المنتج.
المتطلبات:
- قم بتعريف هيكل
Productبالحقول:name: String، وprice: f64، وstock: i32 - اقرأ المدخل الأول كاسم للمنتج
- اقرأ المدخل الثاني وقم بتحويله إلى
f64للسعر - اقرأ المدخل الثالث وقم بتحويله إلى
i32لكمية المخزون - قم بإنشاء مثيل من هيكل
Productبهذه القيم - اطبع معلومات المنتج بالتنسيق الموضح أدناه تماماً
المدخلات:
- السطر الأول: اسم المنتج (على سبيل المثال،
Laptop) - السطر الثاني: السعر كعدد عشري (على سبيل المثال،
999.99) - السطر الثالث: كمية المخزون كعدد صحيح (على سبيل المثال،
15)
المخرجات:
- السطر الأول:
Product: [name] - السطر الثاني:
Price: $[price] - السطر الثالث:
Stock: [quantity]
جرّب بنفسك
use std::io;
// TODO: قم بتعريف الـ struct الخاص بـ Product هنا
fn main() {
// قراءة اسم المنتج
let mut name = String::new();
io::stdin().read_line(&mut name).expect("Failed to read line");
let name = name.trim().to_string();
// قراءة السعر
let mut price_input = String::new();
io::stdin().read_line(&mut price_input).expect("Failed to read line");
let price: f64 = price_input.trim().parse().expect("Failed to parse price");
// قراءة كمية المخزون
let mut stock_input = String::new();
io::stdin().read_line(&mut stock_input).expect("Failed to read line");
let stock: i32 = stock_input.trim().parse().expect("Failed to parse stock");
// TODO: قم بإنشاء مثيل (instance) لـ Product struct باستخدام قيم المدخلات
// TODO: اطبع معلومات المنتج بالتنسيق المطلوب
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس 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الشرائح كمعاملات للدوالشرائح أخرىمراجعة - إيجاد الكلمة الأولى