Probably this should yield an error -- I tend to think we should only permit moves that we cannot enforce from `*` pointers, just to add an extra barrier.
Niko On Tue, Jan 28, 2014 at 12:12:23PM -0800, Kevin Ballard wrote: > Your code is moving the contents of Option<~MyStruct> into the match arm. It > just so happens that this seems to be zeroing out the original pointer in > memory, and that happens to be the same representation that None does for the > type Option<~MyStruct> (since ~ pointers are non-nullable), so the act of > moving the value just happens to be transforming it into a None. > > Normally you couldn't do this, but mutable statics are weird (which is why > you need the unsafe block to access it). > > When you remove the ~, the lines end up printing the same because MyStruct is > implicitly copyable, so your match arm is now copying instead of moving. > > The correct fix here is to use `Some(ref data)` instead of `Some(data)`. This > will take a reference to the data instead of moving it, and the static will > remain unchanged. > > -Kevin > > On Jan 28, 2014, at 11:48 AM, Alexander Stavonin <a.stavo...@gmail.com> wrote: > > > Hi all! I’m not sure is it an error or "static mut" variables > > misunderstanding from my side. The source: > > > > struct MyStruct { > > val: int > > } > > > > static mut global_data: Option<~MyStruct> = None; > > > > fn test_call() { > > unsafe { > > match global_data { > > Some(data) => { println!("We have data {:?}", data);} > > None => { println!("We don't have data");} > > } > > } > > } > > > > fn main() { > > > > unsafe { > > global_data = Some(~MyStruct{val: 42}); > > } > > > > test_call(); > > test_call(); > > } > > > > and output: > > > > We have data ~MyStruct{val: 42} > > We don't have data > > > > But if I’m changing global_data from Option<~MyStruct> to Option<MyStruct> > > output is changed also: > > > > We have data ~MyStruct{val: 42} > > We have data ~MyStruct{val: 42} > > > > Is it normal behaviour and owning pointers cannot be stored in global > > variables or an error? > > _______________________________________________ > > Rust-dev mailing list > > Rust-dev@mozilla.org > > https://mail.mozilla.org/listinfo/rust-dev > > _______________________________________________ > Rust-dev mailing list > Rust-dev@mozilla.org > https://mail.mozilla.org/listinfo/rust-dev _______________________________________________ Rust-dev mailing list Rust-dev@mozilla.org https://mail.mozilla.org/listinfo/rust-dev