كيف يختلف بناء `for<>` (قيود السمات ذات الرتبة الأعلى) عن قيود زمن الحياة العادية في Rust؟
مرحباً بالجميع! لقد كنت أكتب بلغة Rust لعدة أشهر، لكني ما زلت مرتبكاً في النقاط المعقدة المتعلقة بأزمنة الحياة. مؤخراً صادفت بناء `for<'a>` ولا أستطيع فهم كيف يختلف عن قيود زمن الحياة العادية.
هذا مثال حيرني. لدي دالة تستقبل إغلاقاً (closure) يعمل مع أي زمن حياة:
```rust
fn example(f: F)
where
F: Fn(&str) -> &str
{
let s = String::from("hello");
println!("{}", f(&s));
}
```
لكن إذا حاولت تمرير إغلاق يُرجع مرجعاً إلى الوسيطة، فكل شيء يعمل. أما إذا أردت أن يستقبل الإغلاق مرجعاً بأي زمن حياة، أرى في التوثيق هذا البناء:
```rust
fn example(f: F)
where
F: for<'a> Fn(&'a str) -> &'a str
{
// ...
}
```
ما الفرق؟ متى يجب استخدام `for<>` ومتى يجب استخدام معامل زمن حياة عادي؟ ولماذا يشتكي المترجم أحياناً عندما أكتب `Fn(&str) -> &str` وأحياناً لا؟
سأكون ممتناً للشرح.