Avatar ·

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

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