ΠΡΠΎΡ ΠΊΠΎΠ΄ Π½Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ:
struct Foo;
struct Bar {
a: Foo,
b: Foo,
}
fn main() {
let bar = Box::new(Bar { a: Foo, b: Foo });
let Bar { a, b } = *bar;
}
error[E0382]: use of moved value: `bar`
--> x.rs:11:18
|
11 | let Bar { a, b } = *bar;
| - ^ value used here after move
| |
| value moved here
|
= note: move occurs because `bar.a` has type `Foo`, which does not implement the `Copy` trait
ΠΠ΄Π½Π°ΠΊΠΎ Π²ΡΡΠ°Π²ΠΊΠ° ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΠΎΠΉ ΠΏΡΠΈΠ²ΡΠ·ΠΊΠΈ let ΠΌΠ΅ΠΆΠ΄Ρ Π±Π»ΠΎΠΊΠΎΠΌ deref ΠΈ Π΄Π΅ΡΡΡΡΠΊΡΡΡΠΎΠΉ ΠΈΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΡΡΠΎ:
fn main() {
let bar = Box::new(Bar { a: Foo, b: Foo });
let Bar { a, b } = { let intermediate = *bar; intermediate };
}
ΠΡΠΎ ΠΏΠΎΡ ΠΎΠΆΠ΅ Π½Π° ΠΎΡΠΈΠ±ΠΊΡ.
ΠΠ°ΡΡΠΎΠ½ΡΡΡΠ΅ Π²Π΅ΡΡΠΈΠΈ:
rustc 1.23.0 (766bd11c8 2018-01-01)
rustc 1.25.0-nightly (73ac5d6a8 2018-01-11)
Π’Π°ΠΊΠΆΠ΅ Π±ΡΠ²Π°Π΅Ρ Ρ Π²ΡΠΊΡΠΎΠΉΠΊΠ°ΠΌΠΈ ΠΊΠΎΡΠΎΠ±ΠΎΠΊ.
#![feature(box_patterns)]
struct Foo;
struct Bar {
a: Foo,
b: Foo,
}
fn main() {
let bar = Box::new(Bar { a: Foo, b: Foo });
let box Bar { a, b } = bar;
}
ΠΡΠΎ ΠΎΠ±ΠΌΠ°Π½ https://github.com/rust-lang/rust/issues/16223.
Π‘ΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ°: ΡΡΠΎ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΎ!
Π‘Π°ΠΌΡΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ
Π’Π°ΠΊΠΆΠ΅ Π±ΡΠ²Π°Π΅Ρ Ρ Π²ΡΠΊΡΠΎΠΉΠΊΠ°ΠΌΠΈ ΠΊΠΎΡΠΎΠ±ΠΎΠΊ.