美文网首页Rust语言程序员C++
Rust 从基础到实践(7) borrow 和 referenc

Rust 从基础到实践(7) borrow 和 referenc

作者: zidea | 来源:发表于2019-03-29 07:41 被阅读8次
rust_logo.jpg

上一次我们 Rust 的内存分配,今天通过实例给大家介绍一下。这里定义 Person 的结构体,然后实例化赋值后并打印一下。

struct Person {
    age: u32
}
fn main() {
    let p1 = Person{age:30};
    println!("{:?}",p1.age)
}

如果我们创建 p2 然后 p1 赋值给 p2, 这样再打印 p1 就会报编译错误。因为我们知道一个原则就是一个值,也就是一个存放数据的内存只能有一个 owner 。当 p2 = p1 时候我们这时候 p1 已经将对此内存所有权转交给了 p2,也就是 move 行为此时 p1 已经没有使用该内存的权利了。

fn main() {
    let p1 = Person{age:30};
    let p2 = p1;
    println!("{:?}",p1.age)
}

但是在 Rust 语言中是有 borrow(借)的概念,我们可以借来使用 p1 ,可以借多次。

fn main() {
    let p1 = Person{age:30};
    let _p2 = &p1;
    let p3 = &p1;
    println!("{}",p3.age);
    println!("{:?}",p1.age)
}

但是在借来对象我们是无法修改其属性,也很好理解我们借来东西,书只是能看一看,看完之后我们还需要原封不动返回给owner。所以借来的我们只有读的权利。

fn main() {
    let p1 = Person{age:30};
    let _p2 = &p1;
    let p3 = &p1;
    p3.age = 35;
    println!("{}",p3.age);
    println!("{:?}",p1.age)
}

 p3.age = 35;
  |     ^^^^^^^^^^^ `p3` is a `&` reference, so the data it refers to cannot be written

如果要修改,我们首先需要 p1 添加 mut 让其变为可变变量,然后用 &mut 放置 p1 前就可以通过修改 p3 来修改 p

fn main() {
    let mut p1 = Person{age:30};
    let p3 = &mut p1;
    p3.age = 35;
    println!("{}",p3.age);
    println!("{:?}",p1.age)
}

大家可能有点迷惑,这时候 p3 不是有了修改内存的权限 p3 不就是 owner 了吗,为什么 p1 还能访问 age 呢。我们可通过修改打印顺序看出问题,我们在 p3.age 修改后先打印 p1.age 然后再打印 p3.ag

 let mut p1 = Person{age:30};
    let p3 = &mut p1;
    p3.age = 35;
    println!("{:?}",p1.age);
    println!("{}",p3.age);
p3.age = 35;
9  |     println!("{:?}",p1.age);
   |                     ^^^^^^ immutable borrow occurs here
10 |     println!("{}",p3.age);
   |                   ------ mutable borrow later used here
Ownership-2.jpg

我们可以修改一下,将 p3 放置到一个作用域内,当执行完 drop p3 后就会将所有权返回给 p1.

fn main() {
    let mut p1 = Person{age:30};
    {
        let p3 = &mut p1;
        p3.age = 35;
    }
   
    println!("{:?}",p1.age);
}
Rust-1.0-is-the-programming-language-of-Mozillas-Servo.jpg

相关文章

网友评论

    本文标题:Rust 从基础到实践(7) borrow 和 referenc

    本文链接:https://www.haomeiwen.com/subject/arlkbqtx.html