Rust: ПоТизнСнноС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ слишком ΠΆΠ°Π΄Π½ΠΎ Π±Π΅Π· явного объявлСния Ρ‚ΠΈΠΏΠ°

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 19 Ρ„Π΅Π²Ρ€. 2017  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: rust-lang/rust

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ заимствуСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ дольшС, Ρ‡Π΅ΠΌ Π΄ΠΎΠ»ΠΆΠ½ΠΎ:

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

Π§Ρ‚ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ компиляции:

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

Однако, Ссли ΠΌΡ‹ явно объявим Ρ‚ΠΈΠΏ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ оТидалось:

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

НС ΡƒΠ²Π΅Ρ€Π΅Π½, Ρ‡Ρ‚ΠΎ это ошибка ΠΈΠ»ΠΈ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅. Π― Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ смог Π½Π°ΠΉΡ‚ΠΈ объяснСния этого эффСкта Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

ΠœΠ΅Ρ‚Π°

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

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ°: Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ компилируСтся Π½Π° 2018 Π³ΠΎΠ΄.
Ошибки 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

ВсС 3 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

ΠŸΡ€ΠΎΡΡ‚ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ для поисковых систСм: изучая это сСгодня Π½Π° Ρ„ΠΎΡ€ΡƒΠΌΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, Ρƒ мСня слоТилось сильноС Π²ΠΏΠ΅Ρ‡Π°Ρ‚Π»Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ |x: &u8| ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ связана с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ слуТит подсказкой для HRTB.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, связанноС с этим: я Ρ‚Π°ΠΊΠΆΠ΅ столкнулся с этим (особСнно с ΠΎΠΊΡ‚ΡΠ±Ρ€ΡŒΡΠΊΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ huon), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, ΠΊΠ°ΠΊ Π½ΠΈ странно, ломаСтся Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ; Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π±Π΅Π· явной Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ: https://github.com/rust-lang/rust/issues/22557

Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ°: Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ компилируСтся Π½Π° 2018 Π³ΠΎΠ΄.
Ошибки 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

Π—Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ это большС Π½Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΏΠΎ Π½ΠΎΡ‡Π°ΠΌ Π² любом ΠΈΠ· выпусков

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ