
上一次我们 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

我们可以修改一下,将 p3 放置到一个作用域内,当执行完 drop p3 后就会将所有权返回给 p1.
fn main() {
let mut p1 = Person{age:30};
{
let p3 = &mut p1;
p3.age = 35;
}
println!("{:?}",p1.age);
}

网友评论