Rust: L'élision à vie est trop gourmande sans déclaration de type explicite

Créé le 19 févr. 2017  ·  3Commentaires  ·  Source: rust-lang/rust

Dans l'exemple suivant, la fermeture emprunte la valeur plus longtemps qu'elle ne le devrait :

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

Ce qui provoque une erreur de compilation :

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

Cependant, si nous déclarons explicitement le type d'argument, cela fonctionne comme prévu :

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

Je ne sais pas si c'est un bug ou un comportement attendu. Je n'ai pas non plus trouvé d'explication de cet effet dans la documentation.

Méta

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

Commentaire le plus utile

Triage : compile maintenant sur 2018.
Erreurs 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

Tous les 3 commentaires

Juste pour laisser tomber un terme pour les moteurs de recherche : en explorant cela aujourd'hui sur le forum des utilisateurs, j'ai eu la forte impression que la raison |x: &u8| laquelle

Peut-être lié: je suis également tombé sur celui-ci (en particulier l'exemple d'octobre de huon), qui casse assez curieusement dans l'autre sens; c'est-à-dire qu'il ne fonctionne que _sans_ l'annotation explicite : https://github.com/rust-lang/rust/issues/22557

Triage : compile maintenant sur 2018.
Erreurs 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

Fermeture puisque ce n'est plus un problème tous les soirs dans les deux éditions

Cette page vous a été utile?
0 / 5 - 0 notes