Avatar ·

ماذا تعني علامة الاستفهام في قيد معامل النوع (where T: ?Sized)؟

مرحبًا أيها الزملاء! لقد بدأت مؤخرًا في تعلم Rust ووجدت بناء جملة غريبًا في قيود معامل النوع. رأيت هذا الكود: ```rust use std::fmt::Debug; fn print_debug(value: &T) { println!("{:?}", value); } ``` أفهم أن `T: Debug` هو قيد يعني أن النوع T يجب أن ينفذ trait `Debug`. لكن ماذا تفعل علامة الاستفهام قبل `Sized`؟ أعلم أن `Sized` هو trait تلقائي للأنواع التي يكون حجمها معروفًا في وقت الترجمة. لكن لماذا يمكننا كتابة `?Sized`؟ ما الذي يغيره هذا؟ حاولت إزالة `?Sized` وكتابة `T: Debug` فقط، ولا يزال الكود يُترجم. إذن ما الفرق؟ متى يجب استخدام `?Sized`؟ وهل هناك استخدامات أخرى لعلامة الاستفهام في القيود غير ذلك؟