Rust: La elisión de por vida es demasiado codiciosa sin una declaración de tipo explícita

Creado en 19 feb. 2017  ·  3Comentarios  ·  Fuente: rust-lang/rust

En el siguiente ejemplo, el cierre toma prestado el valor por más tiempo del que debería:

fn main () {
    let f = |y| { println!("{}", y); };
    let x = 4u8;
    f(&x);
}

Que causa el error de compilación:

error: `x` does not live long enough
 --> ./test.rs:5:1
  |
4 |     f(&x);
  |        - borrow occurs here
5 | }
  | ^ `x` dropped here while still borrowed
  |
  = note: values in a scope are dropped in the opposite order they are created

Sin embargo, si declaramos el tipo de argumento explícitamente, funciona como se esperaba:

fn main () {
    let f = |y: &u8| { println!("{}", y); };
    let x = 4u8;
    f(&x);
}

No estoy seguro si eso es un error o un comportamiento esperado. Tampoco pude encontrar una explicación de este efecto en la documentación.

Meta

rustc --version --verbose :

rustc 1.17.0-nightly (24a70eb59 2017-02-09)
binary: rustc
commit-hash: 24a70eb598a76edb0941f628a87946b40f2a1c83
commit-date: 2017-02-09
host: x86_64-unknown-linux-gnu
release: 1.17.0-nightly
LLVM version: 3.9
A-closures A-inference A-lifetimes C-bug NLL-fixed-by-NLL T-compiler

Comentario más útil

Triage: ahora compila en 2018.
Errores de 2015:

error[E0597]: `x` does not live long enough
 --> src/main.rs:4:8
  |
4 |     f(&x);
  |        ^ borrowed value does not live long enough
5 | }
  | - `x` dropped here while still borrowed
  |
  = note: values in a scope are dropped in the opposite order they are created

rustc: 1.32.0

Todos 3 comentarios

Solo para dejar caer un término para los motores de búsqueda: explorando esto hoy en el foro de usuarios, tuve la fuerte impresión de que la razón por la que |x: &u8| funciona puede estar relacionada con que sirve como una pista para HRTB.

Posiblemente relacionado: me encontré con este también (específicamente el ejemplo de octubre de Huon), que curiosamente se rompe en la otra dirección; es decir, solo funciona _sin_ la anotación explícita: https://github.com/rust-lang/rust/issues/22557

Triage: ahora compila en 2018.
Errores de 2015:

error[E0597]: `x` does not live long enough
 --> src/main.rs:4:8
  |
4 |     f(&x);
  |        ^ borrowed value does not live long enough
5 | }
  | - `x` dropped here while still borrowed
  |
  = note: values in a scope are dropped in the opposite order they are created

rustc: 1.32.0

Cierre ya que esto ya no es un problema de noche en ninguna de las ediciones.

¿Fue útil esta página
0 / 5 - 0 calificaciones