Rust学习笔记 4.1 所有权机制(OwnerShip)

59 阅读1分钟

4.1 所有权机制(OwnerShip)

OwnerShip Model

OwnerShip规则

  • 每个值都有一个变量称为所有者
  • 每个值只能有一个所有者
  • 当所有者超出作用域时,值被销毁

Stack 和 Heap

  • Stack存储已知大小的数据 快 基础数据类型等
  • Heap存储未知大小的数据 慢 Struct等

move

浅拷贝加失效

 fn main() {
     let a = "abc".to_string();
     let b = a; // a失效
 }

其它语言在这样子的赋值时大多数只做一个浅拷贝,但在rust里,它是把所有权交给b,将a失效

clone

  • 深度拷贝
  • 开辟新的空间
 fn main() {
     let a = "abc";
     let b = a;
     println!("{}, {}", a, b);
 }

输出如下:

 ​
     Finished dev [unoptimized + debuginfo] target(s) in 0.01s
      Running `target\debug\hello.exe`
 abc, abc
 ​

引用

reference

  • 通过&可以获得值的引用
  • 未获得值的所有权,那么它就不会在作用域结束后被销毁
  • 这种情况叫借用borrowed
 struct A {
     a: i32,
 }
 fn change_a(a: &mut A) {
     a.a = 233;
     println!("{}", a.a);
 }
 ​
 fn main() {
     let mut a = A { a: 1 };
     println!("{}", a.a);
     change_a(&mut a);
     println!("{}", a.a);
 }
 ​

注意

在同一作用域下,对某一块数据:

  1. 可以有多个不可变引用
  2. 只能有一个可变的引用
  3. 不能同时拥有一个可变引用和一个不可变引用

Copy 和 Clone

这两个都是特质(trait)

  • Copy trait
  • Clone trait
 #[derive(Debug, Clone, Copy)]
 struct Person<'a> {
     name: &'a str,
     age: i32,
 }
 ​
 fn main() {
     let person = Person {
         name: "Star-tears",
         age: 18,
     };
     let pp = person;
     println!("{:?}", person);
 }
 ​

tips:手动标注name作用域与结构体实例作用域一致