2016-07-24 34 views
1

我的代码:在“匹配”声明“使用的部分移动值”错误

fn main() { 
    let mut messages = vec![]; 

    let msg = Message::Write{message: "msg".to_string()}; 
    match msg { 
     Message::Write{message} => println!("{}", message), 
    }; 

    messages.push(msg); 
} 

enum Message { 
    Write{message: String}, 
} 

错误:

error: use of partially moved value: `msg` [--explain E0382] 
    --> <anon>:9:19 
6 |>   Message::Write{message} => println!("{}", message), 
    |>      ------- value moved here 
... 
9 |>  messages.push(msg); 
    |>     ^^^ value used here after move 
note: move occurs because `msg.message` has type `std::string::String`, which does not implement the `Copy` trait 

error: aborting due to previous error 

它看起来像的message领域的变化在match块所有权。我只想在输入enum的值之前输入Vec。我如何进行编译?

回答

5

通过引用而不是通过值绑定到message字段。

match msg { 
     Message::Write{ref message} => println!("{}", message), 
    }; 
+0

工作,谢谢!我从来没有见过“ref”之前。只能用于“匹配”块吗? “ref”和“&”有什么区别? – Michael

+1

@Michael ['ref'用于模式](https://doc.rust-lang.org/book/patterns.html#ref-and-ref-mut)通过引用绑定到某个位置。 '&'模式位置用于*解构*引用,允许您访问或绑定到位置*。 –

+0

[本文](http://xion.io/post/code/rust-patterns-ref.html)可能有助于理解这种差异。 –