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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值