ماذا تعني علامة الاستفهام في قيد معامل النوع (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`؟ وهل هناك استخدامات أخرى لعلامة الاستفهام في القيود غير ذلك؟