نظرة عامة على الـ Structs
جزء من قسم المنطق وتدفّق التنفيذ في رحلة Rust على Coddy. الدرس 21 من 66.
الآن بعد أن فهمت ما هي الهياكل، لنتعلّم كيفية إنشائها واستخدامها فعليًا. يتضمن ذلك خطوتين: أولًا تعريف بنية الهيكل، ثم إنشاء مثيلات منه.
لتعريف struct، تستخدم الكلمة المفتاحية struct متبوعةً باسم struct وحقوله داخل أقواس معقوفة. لكل حقل اسم ونوع:
struct User {
username: String,
active: bool,
}ينشئ هذا مخططًا لبنية User تحتوي على حقلين: username من النوع String وactive من النوع bool.
اصطلاح التسمية: ينبغي أن تستخدم أسماء البنى في Rust أسلوب PascalCase (ويُسمّى أيضًا UpperCamelCase)، أي أن تبدأ كل كلمة بحرف كبير، مثل User أو ProductItem أو ShoppingCart. سيحذّرك Rust إذا لم تتّبع هذا الاصطلاح.
بمجرد أن تعرّف struct، يمكنك إنشاء instances منه عبر تحديد values لكل حقل:
let user1 = User {
username: String::from("alice"),
active: true,
};لاحظ أنك تكتب اسم البنية متبوعًا بأقواس معقوفة تحتوي على اسم كل حقل، ونقطتين رأسيتين، وقيمته. لا يلزم أن يتطابق ترتيب الحقول مع ترتيب تعريفها.
للوصول إلى حقول مثيل struct، استخدم ترميز النقطة: اكتب اسم المثيل متبوعًا بنقطة ثم اسم الحقل:
println!("Username: {}", user1.username);
println!("Active: {}", user1.active);هنا، يصل user1.username إلى الحقل username في user1، ويصل user1.active إلى الحقل active. يمكنك استخدام قيم هذه الحقول في أي مكان قد تستخدم فيه متغيرًا عاديًا.
التحدي
سهلستتلقى ثلاثة مدخلات: اسم product، وسعرًا (كعدد عشري)، وكمية مخزون (كعدد صحيح). عرّف بنية Product بثلاثة حقول: name من النوع String، وprice من النوع f64، وstock من النوع i32. ثم أنشئ نسخة من هذه البنية باستخدام قيم الإدخال واطبع معلومات product.
المتطلبات:
- عرّف بنية
Productبالحقول:name: Stringوprice: f64وstock: i32 - اقرأ الإدخال الأول باعتباره اسم product
- اقرأ الإدخال الثاني وحوّله إلى
f64للسعر - اقرأ الإدخال الثالث وحوّله إلى
i32لكمية المخزون - أنشئ نسخة من بنية
Productباستخدام هذه القيم - اطبع معلومات product بالتنسيق المطابق تمامًا للتنسيق الموضح أدناه
الإدخال:
- السطر الأول: اسم Product (مثلًا:
Laptop) - السطر الثاني: السعر كعدد عشري (مثلًا:
999.99) - السطر الثالث: كمية المخزون كعدد صحيح (مثلًا:
15)
الإخراج:
- السطر الأول:
Product: [name] - السطر الثاني:
Price: $[price] - السطر الثالث:
Stock: [quantity]
جرّب بنفسك
use std::io;
// TODO: عرّف هيكل 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: أنشئ مثيلاً من هيكل Product باستخدام قيم الإدخال
// TODO: اطبع معلومات المنتج بالتنسيق المطلوب
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق وتدفّق التنفيذ
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 عبر الإنترنت