En quoi la syntaxe `for<>` (Higher-Ranked Trait Bounds) diffère-t-elle des contraintes de durée de vie ordinaires en Rust ?
Bonjour à tous ! J'écris en Rust depuis quelques mois, mais je suis encore confus face aux aspects complexes des durées de vie. Récemment, je suis tombé sur la syntaxe `for<'a>` et je n'arrive pas à comprendre en quoi elle diffère des contraintes de durée de vie ordinaires.
Voici un exemple qui m'a perturbé. J'ai une fonction qui prend une closure fonctionnant avec n'importe quelle durée de vie :
```rust
fn example(f: F)
where
F: Fn(&str) -> &str
{
let s = String::from("hello");
println!("{}", f(&s));
}
```
Mais si j'essaie de passer une closure qui retourne une référence à l'argument, tout fonctionne. Et si je veux que la closure accepte une référence avec n'importe quelle durée de vie, je vois dans la documentation cette syntaxe :
```rust
fn example(f: F)
where
F: for<'a> Fn(&'a str) -> &'a str
{
// ...
}
```
Quelle est la différence ? Quand faut-il utiliser `for<>` et quand un paramètre de durée de vie ordinaire ? Et pourquoi le compilateur râle-t-il parfois si j'écris simplement `Fn(&str) -> &str`, et parfois non ?
Je serais reconnaissant pour une explication.