rust - ¿Por qué se requiere el límite `T: ''a` para almacenar una referencia` &'' a T`?
lifetime (2)
Esto es parte de las reglas de buena formación. El tipo &''a T
solo está bien formado si T: ''a
("T sobrevive ''a''; es obligatorio porque tenemos una referencia a la que podemos acceder durante el alcance ''a
; el valor apuntado a T
necesita ser válido para al menos ese alcance, también).
struct RefWrapper<''a, T>
es un tipo genérico y dice que puede ingresar una vida ''x
un tipo U
y obtener un RefWrapper<''x, U>
nuevamente. Sin embargo, este tipo no está necesariamente bien formado o incluso implementado a menos que se respete el requisito T: ''a
.
Este requisito proviene de un detalle de implementación; no es necesariamente para que T
y ''a
se utilicen juntos como &''a T
en el interior de la estructura. El requisito de buena formación debe promoverse a la interfaz pública de la estructura RefWrapper
, de modo que los requisitos para formar un tipo RefWrapper<''_, _>
sean públicos, incluso si la implementación interna no lo es.
(Hay otros lugares donde el mismo requisito T: ''a
vuelve pero está implícito:
pub fn foo<''a, T>(x: &''a T) { }
Vemos una diferencia: aquí el tipo &''a T
es parte de la API pública, también.)
Dado este código:
struct RefWrapper<''a, T> {
r: &''a T,
}
... el compilador se queja:
error: el tipo de parámetro
T
puede no vivir lo suficienteconsidere agregar un límite de vida útil explícito
T: ''a
para que el tipo de referencia&''a T
no sobreviva a los datos a los que apunta.
Ya he visto este error varias veces y hasta ahora solo escuché el compilador y todo salió bien. Sin embargo, pensando más en ello, no entiendo por qué tengo que escribir T: ''a
.
Por lo que entiendo, ya es imposible obtener tal referencia. Tener &''a T
implica que hay un objeto de tipo T
que vive al menos ''a
. Pero no podemos almacenar ninguna referencia en dicho objeto que apunte a que los datos tengan una vida útil más corta que ''a
. Esto ya daría como resultado un error del compilador.
En ese sentido, ya es imposible obtener una &''a T
donde T
no sobrevive ''a
. Por lo tanto, la anotación adicional ( T: ''a
) no debería ser necesaria.
Estoy en lo cierto ¿Estoy equivocado y si es así: cómo podría descifrar el código, si T: ''a
no sería necesario?
Campo de golf:
Felicitaciones, tenías razón! A partir de Rust 1.31, gracias a RFC 2093, Infer T: ''x
supera los requisitos en las estructuras , se eliminó el requisito para que el usuario escriba esta restricción:
Elimine la necesidad de anotaciones explícitas de
T: ''x
en estructuras. Inferiremos su presencia en base a los campos de la estructura. En resumen, si la estructura contiene una referencia, directa o indirectamente, aT
con vida''x
, entonces inferiremos queT: ''x
es un requisito
Básicamente, no hubo un caso en el que esto no fuera necesario, por lo que no tuvo mucho valor forzar al programador a escribirlo.