Rust中的所有权与函数

示例程序:

fn main() {
    let s = String::from("yuyoubei");   // 变量s进入作用域

    takes_ownership(s);             // s的值被移进了函数,所以它从这里开始不再有效

    let x = 5;                            // 变量x进入了作用域

    makes_copy(x);                // 变量x同样被传递进了函数,
    // 但由于i32是Copy的,所以我们依然可以在这之后使用x

    // println!("s = {}", s);   // 这句话会报错
    println!("x = {}", x);
}   // x首先离开作用域,随后是s(x先离开的原因:因为是栈内存,先进后出)
// 但由于s的值已经发生了移动,所以没有什么特别的事情会发生

fn takes_ownership(some_string: String) {   // some_string进入作用域
    println!("{}", some_string);
}   // some_string在这里离开作用域,drop函数被自动调用,some_string所占用的内存也就自动被释放了

fn makes_copy(some_integer: i32) {      // some_integer进入作用域
    println!("{}", some_integer);
}   // some_integer在这里离开了作用域,没有什么特别的事情发生(因为具有Copy trait的不会有Drop trait)

尝试在 takes_ownership 后使用变量会导致编译时错误,因为 s 已经发生了 移动

posted @ 2022-01-25 12:13  鱼又悲  阅读(40)  评论(0编辑  收藏  举报