研读Rust圣经解析——Rust learn-5(所有权,强大的String)

所有权

Rust 的核心功能(之一)是 所有权(ownership),Rust 通过所有权系统管理内存,编译器在编译时会根据一系列的规则进行检查。如果违反了任何这些规则,程序都不能编译。在运行时,所有权系统的任何功能都不会减慢程序。

栈和堆

这两个概念可以说是非常经典,在Rust中我们应该比其他语言考虑和理解这两个概念更多

相同点

栈和堆都是代码在运行时可供使用的内存

  1. 栈中的所有数据都必须占用已知且固定的大小
  2. 后进先出
  3. 存储速度块

  1. 存储在编译时大小未知或大小可能变化的数据
  2. 存储时会需求一块尽可能大的内存区域
  3. 指针指向,访问慢

所有权规则

  1. Rust 中的每一个值都有一个 所有者(owner)。
  2. 值在任一时刻有且只有一个所有者。
  3. 当所有者(变量)离开作用域,这个值将被丢弃。

请大家牢牢记住这三大规则,因为如果你刚接触Rust不久,你很容易犯所有权的错误!特别是最后一条

作用域

作用域是一块区域,当变量在自己所属的作用域中变量是有效的,出了则变量被释放
我们来看看这个例子:

fn scope_area() -> &str {
   
    let a ="5";
    return a;
}

fn main() {
   
    let x = scope_area();
    println!("{}", x);
}

这段代码在scope_area方法中声明了一个a变量,然后将其返回,注意了,这里我们返回的是&str类型,简单来说它是字符串切片,是对字符串的借用,这段代码看似编辑器通过了,没有语法错误,实则:

在这里插入图片描述
出现如上的错误,说这个需要一个生命周期标识,我们来说一下为什么?
首先&str不是String!而是对String的借用,是字符串切片,他只是借了String,不是它本身,就好比,别人借用了你的一支笔,他就不能说这支笔是他的,他没有处理这只笔的权限,所以他不能再把你的笔借给其他人。
那么&str也是这样,他也无法把所有权移交给其他变量,所以一出作用域,他就失效了,被释放了,新的变量自然无法获取到返回值。当然这里编译器告诉了你解决的方法,就是使用生命周期,但是现在我们没学到,所以不予采纳。
正确方式应该是:

fn scope_area() -> String {
   
    let a = "5";
    return a.to_string();
}

fn main()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值