Avatar ·

¿Cómo se diferencia la sintaxis `for<>` (Higher-Ranked Trait Bounds) de las restricciones de lifetime normales en Rust?

¡Hola a todos! Llevo varios meses escribiendo en Rust, pero todavía me confundo con aspectos complejos de los lifetimes. Recientemente me topé con la sintaxis `for<'a>` y no puedo entender en qué se diferencia de las restricciones de lifetime normales. Aquí hay un ejemplo que me confundió. Tengo una función que toma un closure que trabaja con cualquier lifetime: ```rust fn example(f: F) where F: Fn(&str) -> &str { let s = String::from("hello"); println!("{}", f(&s)); } ``` Pero si intento pasar un closure que devuelve una referencia al argumento, todo funciona. Y si quiero que el closure acepte una referencia con cualquier lifetime, veo en la documentación esta sintaxis: ```rust fn example(f: F) where F: for<'a> Fn(&'a str) -> &'a str { // ... } ``` ¿Cuál es la diferencia? ¿Cuándo se debe usar `for<>` y cuándo un parámetro de lifetime normal? ¿Y por qué el compilador a veces se queja si escribo simplemente `Fn(&str) -> &str` y otras veces no? ¡Agradecería una explicación!