0Pricing
Learn Rust Coding · درس

Deref وسهولة استخدام الأغلفة

اجعل الأغلفة تبدو أصلية

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

مشكلة سهولة الاستخدام

يمنح تغليف نوع داخل Newtype أمانًا، لكنه يفقده سهولة الاستخدام؛ إذ تضطرون فجأة إلى كتابة wrapper.0.method() في كل مكان وإعادة تنفيذ الدوال يدويًا.

يمكن لـ trait Deref استعادة جزء كبير من سهولة الاستخدام هذه، إذ يتيح للغلاف أن يتصرف مثل القيمة التي يحملها.

ما الذي يفعله Deref

يحدد Deref ما الذي ينتجه *value، ويمكّن من استخدام العامل .. وعند استدعاء دالة لا يملكها الغلاف، يحاول المصرّف مرة أخرى على هدف إلغاء الإشارة.

تُسمّى هذه الخطوة التلقائية إكراه إلغاء الإشارة.

use std::ops::Deref;
struct MyBox<T>(T);
impl<T> Deref for MyBox<T> {
    type Target = T;
    fn deref(&self) -> &T { &self.0 }
}

إكراه إلغاء الإشارة عمليًا

بعد تطبيق Deref، يعمل استدعاء الدوال الداخلية على الغلاف مباشرةً. ويُدرج المصرّف .deref() نيابةً عنكم حتى يعثر على الدالة.

use std::ops::Deref;
struct Name(String);
impl Deref for Name {
    type Target = String;
    fn deref(&self) -> &String { &self.0 }
}
fn main() {
    let n = Name("rustacean".to_string());
    println!("len = {}", n.len()); // String::len via deref
}

DerefMut للوصول القابل للتعديل

يوفر Deref وصولًا مشتركًا فقط. ولاستدعاء الدوال التي تحتاج إلى &mut self عبر الغلاف، طبّقوا أيضًا DerefMut، الذي يعيد مرجعًا قابلًا للتعديل إلى القيمة الداخلية.

use std::ops::{Deref, DerefMut};
struct Stack(Vec<i32>);
impl Deref for Stack {
    type Target = Vec<i32>;
    fn deref(&self) -> &Vec<i32> { &self.0 }
}
impl DerefMut for Stack {
    fn deref_mut(&mut self) -> &mut Vec<i32> { &mut self.0 }
}

الإكراه عند حدود الدوال

ينطبق إكراه إلغاء الإشارة على الوسيطات أيضًا. إذ يتحول &Name إلى &String، الذي يتحول بدوره إلى &str، ولذلك يمكنكم تمرير مرجع الغلاف مباشرةً إلى الدوال التي تتوقع المرجع الداخلي.

fn greet(who: &str) {
    println!("hi {}", who);
}
// greet(&name) works: &Name -> &String -> &str

مثال قابل للتشغيل على الإكراه

يمرر هذا البرنامج مرجع غلاف في موضع يُتوقع فيه مقطع نصي. وتحدث عمليات إكراه إلغاء الإشارة المتسلسلة بصمت عند موضع الاستدعاء.

use std::ops::Deref;
struct Tag(String);
impl Deref for Tag {
    type Target = String;
    fn deref(&self) -> &String { &self.0 }
}
fn shout(s: &str) { println!("{}!", s.to_uppercase()); }
fn main() {
    let t = Tag("ship".to_string());
    shout(&t);
}

لا تفرطوا في استخدام Deref

تحذّر إرشادات Rust لواجهات API من تطبيق Deref على أنواع ليست مؤشرات ذكية حقيقية. فالإفراط في استخدامه يجعل الدوال المتاحة للغلاف غير متوقعة ويفاجئ القرّاء.

وإذا كان الغرض من Newtype تقييد واجهة API، فقد يؤدي تطبيق Deref الشامل إلى كشف الدوال التي قصدتم إخفاءها تحديدًا.

AsRef كبديل موجّه

عندما تحتاجون إلى تحويل صريح فقط بدلاً من الإكراه التلقائي، طبّقوا AsRef. يكتب المستدعون .as_ref() عن قصد، مما يحافظ على وضوح الواجهة الخاصة بالغلاف.

struct Path(String);
impl AsRef<str> for Path {
    fn as_ref(&self) -> &str { &self.0 }
}

تفويض طرق محددة

بالنسبة إلى غلاف تقييدي، يُفضَّل كتابة الطرق التي تريدون إتاحتها يدويًا فقط. فهذا يبقي التحكم الكامل في واجهة API بدلاً من كشف كل شيء عبر Deref.

struct Counter(Vec<u8>);
impl Counter {
    fn len(&self) -> usize { self.0.len() }
    fn push(&mut self, b: u8) { self.0.push(b); }
}

المؤشرات الذكية تستخدم Deref

تطبّق المؤشرات الذكية القياسية مثل Box وRc وArc جميعها Deref. لذلك يمكنكم استدعاء طرق القيمة الداخلية عليها بشفافية. وهذا هو الاستخدام المشروع والمقصود لهذه السمة.

use std::rc::Rc;
fn main() {
    let shared = Rc::new(String::from("data"));
    // Deref lets us call String methods directly
    println!("len = {}", shared.len());
}

اختيار استراتيجية سهولة الاستخدام

اختاروا بناءً على الغرض. استخدموا Deref للأغلفة التي تمثل مؤشرات ذكية فعلية، وAsRef للتحويلات الصريحة إلى مراجع، والتفويض اليدوي عندما يجب على نوع جديد تقييد واجهة API لنوعه الداخلي.

فالاختيار الخاطئ إما أن يخفي أكثر مما ينبغي أو يكشف أكثر مما ينبغي.

تحقق سريع

حدّدوا أي غلاف يستحق تطبيق Deref.

مراجعة

يعيد Deref والإكراه عبر إلغاء الإشارة سهولة الاستخدام إلى الأغلفة، إذ يتيحان لمعامل . ولمعاملات المراجع الانتقال إلى القيمة الداخلية؛ ويضيف DerefMut إمكانية الوصول القابل للتعديل.

احجزوا Deref للمؤشرات الذكية الفعلية. وبالنسبة إلى الأنواع الجديدة التقييدية، استخدموا AsRef للتحويلات الصريحة أو فوّضوا الطرق التي تختارون إتاحتها فقط.

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

هل درس «Deref وسهولة استخدام الأغلفة» مجاني؟

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

ماذا ستتعلم في «Deref وسهولة استخدام الأغلفة»؟

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

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

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

كم من الوقت يستغرق درس «Deref وسهولة استخدام الأغلفة»؟

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

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

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

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

  1. نمط Builder
  2. نمط Newtype
  3. Builders بحالة النوع
  4. Deref وسهولة استخدام الأغلفة
← العودة إلى Learn Rust Coding