Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

نظرة عامة على الـ 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;
challenge icon

التحدي

سهل

ستتلقى ثلاثة مدخلات: اسم المنتج، والسعر (كعدد عشري)، وكمية المخزون (كعدد صحيح). قم بتعريف هيكل 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: قم بطباعة معلومات المنتج بالتنسيق المطلوب
    
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Logic & Flow