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

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作用域与结构体实例作用域一致

猜你喜欢

转载自blog.csdn.net/qq_51173321/article/details/125983182
今日推荐