rust - Lifetime Elision
(1)
Primero, la firma de un artículo es solo el bit que le da el nombre y los tipos de su función, es decir, todo lo que necesita para llamarlo (sin necesidad de saber cómo se implementa); por ejemplo:
fn foo(x: u32) -> u32;
Aquí hay otro que toma una referencia de &str
:
fn bar<''a>(s: &''a str) -> &''a str;
En Rust, todas las referencias tienen una vida útil adjunta; esto es parte del tipo. La función de bar
anterior dice más que solo "esta función toma una referencia a una cadena y devuelve otra". Dice que "esta función toma una referencia de cadena, y devuelve otra que es válida por el tiempo que le corresponda . Esta es una parte importante del sistema de propiedad de Rust.
Sin embargo, es molesto y doloroso especificar estas vidas cada vez, por lo que Rust tiene "elisión vitalicia" (es decir, "no las escribe explícitamente"). Todo lo que eso significa es que, en algunos casos (muy) comunes, puede dejar las anotaciones de por vida y Rust las agregará implícitamente. Esto es puramente una conveniencia para los programadores para que no tengan que escribir tantas vidas en casos "obvios".
Las reglas se enumeran en el libro , pero para completarlas son:
- Cada vida en los parámetros de la función que no se especifica de otra manera es diferente. Esto significa que:
fn f(x: &T, y: &U)
medio:
fn f<''a, ''b>(x: &''a T, y: &''b U)
es decir, no hay un vínculo automático entre esas vidas.
- Si solo hay una vida útil de entrada, se usa para cada vida de salida. Asi que:
struct U<''a> {} // struct with a lifetime parameter
fn f(x: &T) -> &U
se convierte en:
fn f<''a>(x: &''a T) -> &''a U<''a>
- De lo contrario, si hay múltiples tiempos de vida de entrada, pero uno de ellos es
&self
o&mut self
(es decir, es un método), todos los tiempos de vida de salida eliminados se igualarán aself
. Esto cubre el caso común de que un método devuelva una referencia a uno de sus campos. Así por ejemplo:
impl S {
fn get_my_item(&self, key: &str) -> &str {}
}
se convierte en:
fn get_my_item<''a,''b>(&''a self, key: &''b str) -> &''a str // use the self lifetime
La documentación tiene algunos ejemplos más.
¿Puede alguien explicar qué elisión de por vida es en términos muy simples?
A partir de los documentos sobre el óxido, "Rust admite poderosas inferencias de tipo local en los cuerpos de las funciones pero no en sus firmas de artículos. Está prohibido permitir el razonamiento sobre los tipos basados solo en la firma del elemento. Sin embargo, por razones ergonómicas, un algoritmo de inferencia secundaria muy restringido La elisión de por vida se refiere únicamente a inferir parámetros de por vida utilizando tres reglas fácilmente memorizables y no ambiguas. Esto significa que la elisión de por vida actúa como una abreviatura para escribir la firma de un elemento, sin ocultar los tipos reales involucrados. como la inferencia local completa si se aplica a él ".
No entiendo lo que esto significa. ¿Qué son las firmas de los artículos? ¿Qué significa inferir parámetros de por vida? Algunos ejemplos o analogías serían útiles. Gracias de antemano por tomarse el tiempo para ayudarme.