0Pricing
Learn Rust Coding · درس

عبارات where والحدود المتعددة

حافظ على قابلية قراءة التواقيع المعقدة

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

عندما تصبح الحدود المضمّنة مزدحمة

تصبح الحدود المضمّنة مثل <T: Display + Clone, U: Debug + Default> صعبة القراءة كلما ازداد عددها. توفر Rust عبارة where بديلًا أوضح.

فهي تنقل القيود إلى أسفل التوقيع، وتحافظ على قِصر قائمة المعاملات.

عبارة where الأساسية

تأتي عبارة where بين نوع القيمة المعادة والجسم. ويسرد كل سطر نوعًا وحدوده.

يعني التوقيعان الشيء نفسه تمامًا؛ لكن صيغة where أسهل قراءة.

use std::fmt::Display;

fn show<T>(value: T)
where
    T: Display,
{
    println!("{}", value);
}

حدود متعددة في where

يمكنكم وضع عدة قيود، قيدًا واحدًا لكل معامل نوع، مع الفصل بينها بفواصل. ويمكن لكل قيد أن يجمع سمات باستخدام +.

يحافظ ذلك على وضوح التوقيع المزدحم مقارنةً بحشر كل شيء داخله.

use std::fmt::{Display, Debug};

fn report<T, U>(a: T, b: U)
where
    T: Display + Clone,
    U: Debug,
{
    println!("{} {:?}", a, b);
}

مثال كامل

يستخدم هذا البرنامج عبارة where التي تتطلب Display. ويعمل البرنامج، ثم يطبع كل وسيط مع تسمية.

لاحظوا كيف يبقى رأس الدالة واضحًا حتى مع إرفاق الحد به.

use std::fmt::Display;

fn label<T>(name: &str, value: T)
where
    T: Display,
{
    println!("{} = {}", name, value);
}

fn main() {
    label("age", 30);
    label("city", "Oslo");
}

حدود لا يمكن للمصرّف تضمينها

لا يمكن كتابة بعض الحدود إلا في عبارة where، مثل الحدود على الأنواع المرتبطة أو المشار إليها. فلا تستطيع الصياغة المضمّنة التعبير عن where Vec<T>: Clone.

لذلك تكون صيغة where أكثر تعبيرًا بلا شك.

fn duplicate<T>(items: Vec<T>) -> (Vec<T>, Vec<T>)
where
    Vec<T>: Clone,
{
    (items.clone(), items)
}

دمج السمات القياسية

يمزج الحد الشائع في التطبيقات الواقعية بين الترتيب والنسخ والطباعة. تبحث max_of العامة هذه عن أكبر عنصر في مقطع.

تجمع عبارة where السمات الثلاث التي تعتمد عليها الخوارزمية.

use std::fmt::Display;

fn max_of<T>(items: &[T]) -> &T
where
    T: PartialOrd + Display,
{
    let mut best = &items[0];
    for item in items {
        if item > best { best = item; }
    }
    best
}

تشغيل max_of

إليكم الفكرة نفسها في برنامج قابل للتشغيل. يستوفي مقطع الأعداد الصحيحة PartialOrd + Display، لذا تُترجم الاستدعاءات وتطبع القيمة القصوى.

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

fn max_of<T>(items: &[T]) -> &T
where
    T: PartialOrd,
{
    let mut best = &items[0];
    for item in items {
        if item > best { best = item; }
    }
    best
}

fn main() {
    let nums = [3, 7, 1, 9, 4];
    println!("{}", max_of(&nums));
}

where في كتل impl

يمكن أيضًا إرفاق عبارات where بكتل impl. ويضيف ذلك طريقة فقط عندما يطبّق النوع المخزّن Display.

لن تمتلك النسخ التي لا يطبّق فيها T السمة Display هذه الطريقة ببساطة.

use std::fmt::Display;

struct Holder<T> { item: T }

impl<T> Holder<T>
where
    T: Display,
{
    fn print(&self) {
        println!("{}", self.item);
    }
}

حدود كثيرة دفعة واحدة

تتطلب واجهات البرمجة العامة الواقعية غالبًا عدة سمات لكل معامل. ويتطلب هذا التوقيع النسخ والتنقيح وقيمة افتراضية.

تحافظ عبارة where على سهولة القراءة رغم وجود ثلاثة حدود على نوع واحد.

use std::fmt::Debug;

fn build<T>() -> T
where
    T: Default + Clone + Debug,
{
    let v = T::default();
    v.clone()
}

اختيار الصياغة المضمّنة أم where

استخدموا الحدود المضمّنة لقيد بسيط أو قيدين. وانتقلوا إلى where عند وجود معاملات كثيرة أو قوائم سمات طويلة أو حدود على أنواع معقدة.

تُترجم الصياغتان إلى الشيفرة نفسها؛ فالاختيار يتعلق بسهولة القراءة فقط.

where مع أعمار الاستدعاء

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

تشترط العبارة هنا أن يعيش T مدة أطول من عمر الاستدعاء 'a.

fn keep<'a, T>(value: &'a T) -> &'a T
where
    T: 'a,
{
    value
}

تحقق سريع

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

مراجعة

تنقل عبارة where حدود السمات إلى أسفل التوقيع، مما يحسن سهولة القراءة عندما تزداد المعاملات أو قوائم السمات. ويمكنها أيضًا التعبير عن الحدود على الأنواع المعقدة وأعمار الاستدعاء التي لا تستطيع الصياغة المضمّنة التعبير عنها.

تُترجم الحدود المضمّنة وحدود where بالطريقة نفسها، لذا اختاروا الصياغة الأوضح قراءة.

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

هل درس «عبارات where والحدود المتعددة» مجاني؟

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

ماذا ستتعلم في «عبارات where والحدود المتعددة»؟

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

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

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

كم من الوقت يستغرق درس «عبارات where والحدود المتعددة»؟

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

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

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

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

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