حدود Trait
قيّد الأنواع العامة باستخدام traits
حدود Trait درس مجاني في Learn Rust Coding على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Learn Rust Coding، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Learn Rust Coding 4 دروس في المجموع.
وظيفة حدود السمات
يقيّد حد السمة نوعًا عامًا بالأنواع التي تطبّق سمة معينة. وهو يخبر المصرّف بالسلوك الذي يضمنه النوع.
يتيح ذلك استخدام طرائق السمة داخل الشيفرة العامة، مع إبقاء الدالة قابلة للاستخدام مع أنواع متعددة.
صياغة الحد المضمّن
تضع الصيغة الأبسط الحد مباشرة بعد معامل النوع: T: Trait. يجب أن يطبّق T هنا Display حتى يمكن طباعته.
يمكنكم الآن داخل الدالة استدعاء أي طريقة توفرها Display.
use std::fmt::Display;
fn show<T: Display>(value: T) {
println!("value = {}", value);
}سمة مخصصة
تعمل الحدود مع سماتكم الخاصة أيضًا. عرّفوا سمة تحتوي على طريقة، ثم قيّدوا دالة عامة بها.
تتطلب سمة Summary هذه طريقة summarize تعيد نصًا.
trait Summary {
fn summarize(&self) -> String;
}التطبيق والتقييد
طبّقوا السمة على نوع، وعندها يمكن لدالة مقيّدة قبول أي نوع يطبّقها. تستدعي الدالة طريقة السمة من دون معرفة النوع المحدد.
يطبع هذا البرنامج الكامل ملخصًا لـ Article.
trait Summary { fn summarize(&self) -> String; }
struct Article { title: String }
impl Summary for Article {
fn summarize(&self) -> String {
format!("Article: {}", self.title)
}
}
fn notify<T: Summary>(item: &T) {
println!("{}", item.summarize());
}
fn main() {
let a = Article { title: String::from("Rust") };
notify(&a);
}دمج الحدود باستخدام +
يمكنكم اشتراط عدة سمات معًا بضمها باستخدام +. يجب أن يطبّق T هنا كلًا من Display وClone.
يمكن للدالة عندئذ طباعة القيمة واستنساخها أيضًا.
use std::fmt::Display;
fn process<T: Display + Clone>(value: T) {
let copy = value.clone();
println!("{}", copy);
}impl Trait في الوسائط
صياغة impl Trait في موضع الوسيط اختصار لحد بسيط. وتعني item: &impl Summary الشيء نفسه الذي يعنيه معامل <T: Summary>.
وهي موجزة في حالات الوسيط الواحد، لكنها تمنح تحكمًا أقل عند إعادة استخدام النوع.
trait Summary { fn summarize(&self) -> String; }
fn notify(item: &impl Summary) {
println!("{}", item.summarize());
}إعادة impl Trait
يمكنكم أيضًا إعادة impl Trait لإخفاء نوع محدد مع ضمان تطبيقه لسمة ما. ويفيد ذلك مع الدوال المغلقة والمكررات.
لا يعرف المستدعي سوى أن النتيجة تطبّق السمة المسماة.
fn make_adder(n: i32) -> impl Fn(i32) -> i32 {
move |x| x + n
}
fn main() {
let add5 = make_adder(5);
println!("{}", add5(10));
}الحدود تتيح المعاملات
تُطابق المعاملات سمات: يتطلب + السمة Add، ويتطلب == السمة PartialEq، بينما تتطلب المقارنات PartialOrd. ويتيح تقييد النوع بهذه السمات استخدام المعاملات في الشيفرة العامة.
يتطلب الجمع هنا أن يطبّق T السمة Add مع نفسه.
use std::ops::Add;
fn sum<T: Add<Output = T>>(a: T, b: T) -> T {
a + b
}الطرائق الافتراضية للسمات
يمكن للسمات توفير أجسام افتراضية للطرائق. ويمكن للأنواع المطبّقة للسمة تجاوزها أو الاعتماد على الافتراضي. وتستخدم الأنواع العامة المقيّدة أيًا منهما يكون فعالًا.
تحتوي Summary هذه على طريقة summarize افتراضية يمكن للأنواع إبقاؤها كما هي.
trait Summary {
fn summarize(&self) -> String {
String::from("(no summary)")
}
}
struct Note;
impl Summary for Note {}الاستدعاء الساكن مقابل الديناميكي
تستخدم حدود السمات الاستدعاء الساكن؛ إذ يختار المصرّف الطريقة الدقيقة في وقت الترجمة عبر التوليد الأحادي. أما dyn Trait فيستخدم الاستدعاء الديناميكي عبر جدول افتراضي.
تكون الحدود عادةً أسرع، بينما يبادل dyn السرعة بملفات تنفيذية أصغر ومرونة في وقت التشغيل.
الحدود على البنى العامة
لا تقتصر حدود السمات على الدوال. يمكنكم اشتراطها عند تعريف بنية، بحيث تستوفي جميع النسخ السمة.
يضمن كل Sortable<T> هنا إمكانية مقارنة عناصره.
struct Sortable<T: PartialOrd> {
items: Vec<T>,
}تحقق سريع
اختبروا مدى فهمكم لحدود السمات.
مراجعة
تقيّد حدود السمات الأنواع العامة، مما يسمح للمصرّف بإتاحة طرائق السمة ومعاملاتها. ادمجوا السمات باستخدام +، واستخدموا impl Trait اختصارًا في الوسائط أو القيم المعادة.
توفر الحدود استدعاءً ساكنًا دون تكلفة إضافية، بخلاف الاستدعاء الديناميكي باستخدام dyn Trait.
الأسئلة الشائعة
هل درس «حدود Trait» مجاني؟
نعم — نص درس «حدود Trait» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Learn Rust Coding، انتقل إلى CoddyKit PRO. تتضمن دورة Learn Rust Coding 4 دروس في المجموع.
ماذا ستتعلم في «حدود Trait»؟
قيّد الأنواع العامة باستخدام traits تتمرن على Learn Rust Coding مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Learn Rust Coding؟
لا تُشترط خبرة سابقة. Learn Rust Coding على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «حدود Trait»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Learn Rust Coding هذا؟
نعم. كل درس في Learn Rust Coding يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.