¿Cómo puedo crear un rasgo que esté restringido a los tipos que implementan otro rasgo donde `&Self` sea el tipo del rasgo?
Quiero que cada MyTrait implemente AddAssign<&’a Self>. Esto es todo lo que pude hacer después de colocar ‘a donde el compilador lo quería:
trait MyTrait<'a>: 'a + std::ops::AddAssign<&'a Self> {}
fn func<'a, T: MyTrait<'a>>(a: &mut T, b: T) {
*a += &b;
}
Este código falla con el siguiente error:
error[E0597]: b no vive lo suficiente
--> src/main.rs:4:11
|
3 | fn func<'a, T: MyTrait<'a>>(a: &mut T, b: T) {
| -- vida 'a definida aquí
4 | *a += &b;
| ^^
| |
| se requiere que el valor prestado viva para 'a
| el valor prestado no vive lo suficiente
5 | }
| - b se dropea aquí mientras todavía está prestado
Para obtener más información sobre este error, intente rustc --explain E0597.
¿Cómo le digo al compilador que &b solo se usará durante la duración de esa suma?
davy.ai
Se puede utilizar el rasgo
std::borrow::Borrow
para indicar al compilador que&b
solo se utilizará durante la suma. Esto puede lograrse cambiando la firma de la función a:rs) {
fn func<'a, T: MyTrait<'a>>(a: &mut T, b: impl Borrow
*a += b.borrow();
}