0Pricing
Learn Rust Coding · درس

Structs وEnums العامة

أنشئ أنواع بيانات مرنة

Structs وEnums العامة درس مجاني في Learn Rust Coding على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Learn Rust Coding، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Learn Rust Coding 4 دروس في المجموع.

هياكل البيانات العامة

مثل الدوال تمامًا، يمكن أن تكون البنى والتعدادات عامة بالنسبة إلى نوع واحد أو أكثر. يتيح ذلك لتعريف واحد تخزين قيم من أي نوع.

تُبنى المكتبة القياسية بهذه الطريقة: فكل من Vec<T> وOption<T> وResult<T, E> أنواع عامة.

بنية عامة

صرّحوا بمعامل النوع بعد اسم البنية، ثم استخدموه للحقول. تخزّن Point هنا قيمتين من النوع نفسه T.

يخدم التعريف الواحد الآن نقاطًا صحيحة ونقاطًا عشرية وغير ذلك.

struct Point<T> {
    x: T,
    y: T,
}

إنشاء بنى عامة

عند إنشاء نسخة، يستدل المصرّف على T من قيم الحقول. ويجب أن يتفق الحقلان على النوع نفسه.

ينشئ هذا البرنامج نقطة صحيحة ونقطة عشرية من البنية نفسها.

struct Point<T> {
    x: T,
    y: T,
}

fn main() {
    let a = Point { x: 1, y: 2 };
    let b = Point { x: 1.5, y: 4.0 };
    println!("{} {}", a.x, b.y);
}

معاملات الأنواع المختلطة

يتيح استخدام معاملين اختلاف أنواع الحقول. يمكن لـ Pair<T, U> تخزين عدد صحيح ونص في الوقت نفسه.

اختاروا معاملًا واحدًا عندما يجب أن تتطابق الحقول، وعدة معاملات عندما يمكن أن تختلف.

struct Pair<T, U> {
    first: T,
    second: U,
}

الطرائق في البنى العامة

لإضافة طرائق، كرروا معامل النوع في كتلة impl: impl<T> Point<T>. يصرّح المعامل الذي يأتي بعد impl به، بينما يطبّقه المعامل الذي يأتي بعد اسم النوع.

تعيد دالة الوصول هنا مرجعًا إلى الحقل x.

struct Point<T> {
    x: T,
    y: T,
}

impl<T> Point<T> {
    fn x(&self) -> &T {
        &self.x
    }
}

الطرائق مع الحدود

يمكنكم كتابة طرائق لأنواع محددة فقط أو لأنواع تستوفي حدًا معينًا. تنطبق كتلة impl هذه على Point<f64> فقط.

لذلك توجد dist_from_origin للنقاط العشرية، ولا توجد للنقاط الصحيحة.

struct Point<T> { x: T, y: T }

impl Point<f64> {
    fn dist_from_origin(&self) -> f64 {
        (self.x * self.x + self.y * self.y).sqrt()
    }
}

تعداد عام

التعدادات عامة أيضًا. ويمكن لكل متغير أن يحمل بيانات عامة. وهذا يحاكي Option القياسي، الذي يكون إما Some(T) أو None.

يساعدكم تعريف نوعكم الخاص على فهم طريقة عمل نوع المكتبة.

enum Maybe<T> {
    Just(T),
    Nothing,
}

معاملان في تعداد

يستخدم Result معاملين حتى يمكن أن تختلف قيمتا النجاح والخطأ. إليكم نسخة مبسطة منه.

تتيح معاملات الأنواع المتعددة في التعدادات معالجة أخطاء مرنة في مختلف أجزاء المنظومة.

enum Either<L, R> {
    Left(L),
    Right(R),
}

مطابقة التعدادات العامة

تطابقون أنماط التعدادات العامة بالطريقة نفسها تمامًا التي تطابقون بها التعدادات ذات الأنواع المحددة. وتصبح الحمولة المرتبطة بالحد ربطًا داخل الذراع.

يفك هذا البرنامج تغليف Maybe مخصص، ثم يطبع القيمة المحتواة أو قيمة بديلة.

enum Maybe<T> { Just(T), Nothing }

fn main() {
    let m: Maybe<i32> = Maybe::Just(5);
    match m {
        Maybe::Just(n) => println!("got {}", n),
        Maybe::Nothing => println!("empty"),
    }
}

تغليف قيمة

من الأنماط الشائعة بنية تغليف ذات حقل واحد من النوع T، إلى جانب طرائق مساعدة. تخزّن Wrapper هنا أي قيمة وتعيدها.

يشكّل هذا أساس أنماط النوع الجديد والأنواع الشبيهة بالمؤشرات الذكية.

struct Wrapper<T> { inner: T }

impl<T> Wrapper<T> {
    fn new(v: T) -> Self {
        Wrapper { inner: v }
    }
}

fn main() {
    let w = Wrapper::new("hi");
    println!("{}", w.inner);
}

لا تكلفة إضافية في وقت التشغيل

تُولَّد البنى والتعدادات العامة أحاديًا أيضًا. يصبح Point<i32> وPoint<f64> نوعين متميزين ومتخصصين بالكامل بعد الترجمة.

لا يوجد توجيه غير مباشر مخفي أو وسم للنوع العام نفسه.

تحقق سريع

اختبروا مدى فهمكم للبنى والتعدادات العامة.

مراجعة

تصرّح البنى والتعدادات بمعاملات الأنواع بعد أسمائها، وتستخدمها في الحقول والمتغيرات، مما يتيح حاويات قابلة لإعادة الاستخدام مثل Option وResult.

تكرر الطرائق المعاملات في impl<T>، ويمكنكم كتابة كتل impl متخصصة للأنواع المحددة. ويُولَّد كل شيء أحاديًا لتحقيق عدم وجود تكلفة إضافية.

الأسئلة الشائعة

هل درس «Structs وEnums العامة» مجاني؟

نعم — نص درس «Structs وEnums العامة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Learn Rust Coding، انتقل إلى CoddyKit PRO. تتضمن دورة Learn Rust Coding 4 دروس في المجموع.

ماذا ستتعلم في «Structs وEnums العامة»؟

أنشئ أنواع بيانات مرنة تتمرن على Learn Rust Coding مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Learn Rust Coding؟

لا تُشترط خبرة سابقة. Learn Rust Coding على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «Structs وEnums العامة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Learn Rust Coding هذا؟

نعم. كل درس في Learn Rust Coding يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الدوال العامة
  2. Structs وEnums العامة
  3. حدود Trait
  4. عبارات where والحدود المتعددة
← العودة إلى Learn Rust Coding