0Pricing
Learn Rust Coding · درس

تعريف السمات

السلوك المشترك

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

ما هي السمة؟

تعرّف السمة سلوكًا مشتركًا — أي مجموعة من الدوال يمكن لنوع ما تنفيذها. وهي تشبه الواجهة في لغات أخرى.

تتيح السمات لأنواع مختلفة الاتفاق على عقد مشترك.

التصريح عن سمة

استخدم الكلمة المفتاحية trait متبوعة بتواقيع الدوال. وتعلن التواقيع ما يجب على الأنواع المنفذة توفيره.

trait Greet {
    fn hello(&self) -> String;
}

fn main() {
    println!("trait declared");
}

تنفيذ سمة

استخدم impl TraitName for Type لتوفير الدوال. ويجب أن يطابق التوقيع السمة تمامًا.

trait Greet {
    fn hello(&self) -> String;
}

struct Dog;

impl Greet for Dog {
    fn hello(&self) -> String {
        String::from("Woof")
    }
}

fn main() {
    let d = Dog;
    println!("{}", d.hello());
}

أنواع عديدة، وسمة واحدة

يمكن لعدة أنواع تنفيذ السمة نفسها، كلٌّ بطريقته الخاصة. وهكذا توحّد السمات السلوك بين أنواع غير مرتبطة ببعضها.

trait Greet { fn hello(&self) -> String; }

struct Dog;
struct Cat;

impl Greet for Dog { fn hello(&self) -> String { String::from("Woof") } }
impl Greet for Cat { fn hello(&self) -> String { String::from("Meow") } }

fn main() {
    println!("{}", Dog.hello());
    println!("{}", Cat.hello());
}

السمات كمعلمات للدوال

تقبل صياغة impl Trait أي نوع ينفذ السمة. وتعمل الدالة بطريقة موحّدة دون معرفة النوع الفعلي.

trait Greet { fn hello(&self) -> String; }
struct Dog;
impl Greet for Dog { fn hello(&self) -> String { String::from("Woof") } }

fn announce(g: &impl Greet) {
    println!("It says: {}", g.hello());
}

fn main() {
    announce(&Dog);
}

حدود السمات على الأنواع العامة

يمكنك اشتراط تنفيذ النوع العام لسمة باستخدام حد سمة. ويتيح ذلك استخدام دوال السمة داخل الدالة.

trait Greet { fn hello(&self) -> String; }
struct Cat;
impl Greet for Cat { fn hello(&self) -> String { String::from("Meow") } }

fn shout<T: Greet>(g: &T) {
    println!("{}!", g.hello().to_uppercase());
}

fn main() {
    shout(&Cat);
}

حدود متعددة باستخدام +

اشترط عدة سمات في الوقت نفسه باستخدام +. يجب على القيمة هنا تنفيذ سمة مخصصة وClone القياسية معًا.

trait Named { fn name(&self) -> String; }

#[derive(Clone)]
struct Item { label: String }

impl Named for Item {
    fn name(&self) -> String { self.label.clone() }
}

fn describe<T: Named + Clone>(t: &T) {
    let copy = t.clone();
    println!("named {}", copy.name());
}

fn main() {
    describe(&Item { label: String::from("box") });
}

عبارة where

عند وجود حدود كثيرة، تحافظ عبارة where على سهولة قراءة التوقيع بنقل القيود إلى أسفله.

use std::fmt::Debug;

fn print_all<T>(items: &[T])
where
    T: Debug,
{
    for it in items {
        println!("{:?}", it);
    }
}

fn main() {
    print_all(&[1, 2, 3]);
}

يمكن أن تحتوي السمات على عدة دوال

يمكن للسمة التصريح عن عدة دوال. ويجب على الأنواع المنفذة توفير جميع الدوال المطلوبة، مما يمنح النوع مجموعة سلوك مكتملة.

trait Shape {
    fn area(&self) -> f64;
    fn name(&self) -> String;
}

struct Square { side: f64 }

impl Shape for Square {
    fn area(&self) -> f64 { self.side * self.side }
    fn name(&self) -> String { String::from("square") }
}

fn main() {
    let s = Square { side: 3.0 };
    println!("{} area {}", s.name(), s.area());
}

لماذا السمات مهمة؟

تتيح السمات تعدد الأشكال دون وراثة. وهي تدعم الأنواع العامة، وتحميل العوامل الزائد (Add)، والتنسيق (Display)، وجزءًا كبيرًا من المكتبة القياسية.

وهي جوهر نموذج التجريد في Rust.

قاعدة الاتساق

تنص قاعدة اليتيم على أنه لا يمكنك تنفيذ سمة لنوع إلا إذا كنت تملك السمة أو النوع. ويمنع ذلك حدوث عمليات تنفيذ متعارضة بين crates.

تحقق سريع

اختبر فهمك للسمات.

مراجعة

لقد تعلمت تعريف السمات واستخدامها:

  • تعلن trait عن سلوك مشترك
  • توفر impl Trait for Type الدوال
  • تقيّد حدود السمات (T: Trait و+ وwhere) الأنواع العامة
  • تحافظ قاعدة اليتيم على اتساق عمليات التنفيذ

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

هل درس «تعريف السمات» مجاني؟

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

ماذا ستتعلم في «تعريف السمات»؟

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

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

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

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

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

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

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

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

  1. تعريف السمات
  2. كائنات السمات وdyn
  3. الإرسال الساكن مقابل الديناميكي
  4. الأساليب الافتراضية
← العودة إلى Learn Rust Coding