Oh, great! I completely forgot that I can destructure structs in let bindings too. Indeed it works. Thanks!
2014-01-26 Alex Crichton <[email protected]>: > You'll want to do destructuring assignment here. This means that you > take ownership of all fields in parallel: > > fn into_test2(self) -> Test2 { > let Test1 { a, b } = self; > Test2 { > c: a, > d: b as f64 > } > } > > On Sun, Jan 26, 2014 at 9:32 AM, Vladimir Matveev > <[email protected]> wrote: >> Hi all, >> >> Consider this code: >> >> struct Test1 { >> a: ~str, >> b: f32, >> } >> >> struct Test2 { >> c: ~str, >> d: f64 >> } >> >> impl Test1 { >> fn into_test2(self) -> Test2 { >> Test2 { >> c: self.a, >> d: self.b as f64 >> } >> } >> } >> >> >> In into_test2() method I want to consume Test1 struct completely. But >> because ~str is not implicitly copyable, self.a is moved out of self, >> and on Test2.d field assignment I get the following error: >> >> main.rs:15:16: 15:21 error: use of partially moved value: `self` >> main.rs:15 d: self.b as f64 >> ^~~~~ >> main.rs:14:16: 14:22 note: `self.a` moved here because it has type >> `~str`, which is non-copyable (perhaps you meant to use clone()?) >> main.rs:14 c: self.a, >> ^~~~~~ >> >> I know that I can, say, do self.a.clone() to avoid moving, but I don't >> want extra allocations. And it is also possible to reorder Test2 >> fields assignments and it will work, but it won't if both fields are >> not copyable. >> >> So, the question is: how to correctly correctly move several pieces of >> data out from a struct without using clone()? Is it possible at all? >> >> Thanks, >> Vladimir. >> _______________________________________________ >> Rust-dev mailing list >> [email protected] >> https://mail.mozilla.org/listinfo/rust-dev _______________________________________________ Rust-dev mailing list [email protected] https://mail.mozilla.org/listinfo/rust-dev
