es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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?

Tags:  ,

Answer

  1. Avatar for 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();
    }

Comments are closed.