rust语言match模式匹配涉及转移所有权Error Case
struct S{
data:String,
}
//注意:因为String默认是移动语义,从而决定结构体S也是移动语义,可采用(1)或(2)两种方法解决编译错误;关键思路:放弃获取结构体S的字段data的所有权,改为借用。
fn process(s_ref:&S){//&S ,借用
match *s_ref { //S , 值
//(1) match s_ref { //&S , 借用
//(2) S{ref data} => { //data:&String , 借用
S{data} => { //出错点.
println!("Data: {}",data);
},
// _ => {},
}
}
fn main(){
let s = S{
data:String::from("hello world"),
};
process(&s);
}
编译错误:
Compiling playground v0.0.1 (/playground)
error[E0507]: cannot move out of `s_ref.data` which is behind a shared reference
--> src/main.rs:7:11
|
7 | match *s_ref {
| ^^^^^^
...
11 | S{data} => {
| ----
| |
| data moved here
| move occurs because `data` has type `String`, which does not implement the `Copy` trait
|
help: consider removing the dereference here
|
7 - match *s_ref {
7 + match s_ref {
|
For more information about this error, try `rustc --explain E0507`.
error: could not compile `playground` (bin "playground") due to 1 previous error
注意:个人水平有限,难免谬误,欢迎指正,仅做参考,抛砖引玉;怕日后遗忘,故随笔记录。