نظرة عامة على الـ Structs
جزء من قسم Logic & Flow في رحلة Rust على Coddy — الدرس 21 من 66.
الآن بعد أن فهمت ما هي الـ structs، دعنا نتعلم كيفية إنشائها واستخدامها فعلياً. يتضمن ذلك خطوتين: أولاً تحديد بنية الـ struct، ثم إنشاء مثيلات (instances) منها.
لتعريف هيكل (struct)، يمكنك استخدام الكلمة المفتاحية struct متبوعة باسم الهيكل وحقوله داخل أقواس متعرجة. كل حقل له اسم ونوع:
struct User {
username: String,
active: bool,
}يؤدي هذا إلى إنشاء مخطط لهيكل User مع حقلين: username من النوع String و active من النوع bool.
تتبع أسماء الهياكل (Struct) في لغة Rust نمط PascalCase (يُسمى أيضًا CamelCase) — حيث تبدأ كل كلمة بحرف كبير، بدون فواصل سفلية (underscores). على سبيل المثال:
User، BlogPost، GamePlayer.بمجرد قيامك بتعريف struct، يمكنك إنشاء مثيلات (instances) منه عن طريق تحديد قيم لكل حقل:
let user1 = User {
username: String::from("alice"),
active: true,
};لاحظ أنك تقوم بتوفير اسم الـ struct متبوعاً بأقواس معقوفة تحتوي على اسم كل حقل، ونقطتين رأسيتين، وقيمته. لا يشترط أن يطابق ترتيب الحقول ترتيب التعريف.
للوصول إلى قيمة حقل من مثيل struct، استخدم تدوين النقطة (dot notation) — اسم المثيل متبوعًا بنقطة واسم الحقل:
println!("{}", user1.username); // alice
println!("{}", user1.active); // trueيمكنك أيضًا تحديث قيمة حقل باستخدام تدوين النقطة، طالما تم التصريح عن المثيل باستخدام let mut:
let mut user1 = User {
username: String::from("alice"),
active: true,
};
user1.active = false;التحدي
سهلستتلقى ثلاثة مدخلات: اسم المنتج، والسعر (كعدد عشري)، وكمية المخزون (كعدد صحيح). قم بتعريف هيكل 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]
ورقة مرجعية
تستخدم أسماء الـ Struct نمط PascalCase (على سبيل المثال، UserAccount). لتعريف struct، استخدم الكلمة المفتاحية struct متبوعة باسم الـ struct وحقوله داخل أقواس معقوفة:
struct User {
username: String,
active: bool,
}لكل حقل اسم ونوع.
لإنشاء مثيل (instance) من struct، حدد قيمًا لكل حقل:
let user1 = User {
username: String::from("alice"),
active: true,
};ليس من الضروري أن يتطابق ترتيب الحقول في المثيل مع ترتيب التعريف.
للوصول إلى حقل، استخدم تدوين النقطة (dot notation) — اسم المثيل متبوعًا بنقطة واسم الحقل:
println!("{}", user1.username); // يطبع: alice
println!("{}", user1.active); // يطبع: trueجرّب بنفسك
use std::io;
// TODO: قم بتعريف هيكل المنتج (Product struct) هنا
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: قم بإنشاء مثيل لهيكل المنتج باستخدام القيم المدخلة
// 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الشرائح كمعاملات للدوالشرائح أخرىمراجعة - إيجاد الكلمة الأولى