Como a sintaxe `for<>` (Higher-Ranked Trait Bounds) difere das restrições normais de tempo de vida em Rust?
Olá a todos! Já escrevo em Rust há alguns meses, mas ainda me confundo com questões complexas de tempos de vida. Recentemente me deparei com a sintaxe `for<'a>` e não consigo entender como ela difere das restrições normais de tempo de vida.
Aqui está um exemplo que me confundiu. Tenho uma função que recebe uma closure que trabalha com qualquer tempo de vida:
```rust
fn example(f: F)
where
F: Fn(&str) -> &str
{
let s = String::from("hello");
println!("{}", f(&s));
}
```
Mas se eu tentar passar uma closure que retorna uma referência ao argumento, tudo funciona. E se eu quiser que a closure aceite uma referência com qualquer tempo de vida, vejo na documentação esta sintaxe:
```rust
fn example(f: F)
where
F: for<'a> Fn(&'a str) -> &'a str
{
// ...
}
```
Qual é a diferença? Quando devo usar `for<>` e quando usar um parâmetro de lifetime normal? E por que o compilador às vezes reclama se eu escrevo apenas `Fn(&str) -> &str`, e às vezes não?
Agradeço pela explicação.