【练习】rust中的复制语义和移动语义

1.基本类型都是复制语义的

fn main(){
    let a = 123;
    {
        #[allow(unused_variables)]
        let b = a;  //如果是移动语义,那么后续的a将不再有效
    }
    println!("{:?}", a);  //编译成功,说明a是复制语义
}

2.非基本类型是移动语义

fn main(){
    let a = String::from("abc");
    {
        #[allow(unused_variables)]
        let b = a;  //如果是移动语义,那么后续的a将不再有效
    }
    println!("{:?}", a);  //编译失败,说明a是移动语义
}

3.赋值给占位符,没有任何效果

fn main(){
    let a = String::from("abc");
    {
        #[allow(unused_variables)]
        let _ = a;
    }
    println!("{:?}", a);  //编译成功,说明占位符并没有产生移动的效果
}

4.struct类型默认是移动语义

#[derive(Debug)]
struct MyStruct{
  value: i64
}

fn main(){
    let a = MyStruct{value:1234};
    {
        #[allow(unused_variables)]
        let b = a;
    }
    println!("{:?}", a);  //编译失败,说明a移动了
}

5.声明struct的复制语义

#[derive(Debug,Clone,Copy)]
struct MyStruct{
  value: i64
}

fn main(){
    let a = MyStruct{value:1234};
    {
        #[allow(unused_variables)]
        let b = a;
    }
    println!("{:?}", a);  //编译成功,说明a没有移动
}

posted on 2022-01-18 20:12  ahfuzhang  阅读(138)  评论(0)    收藏  举报