研读Rust圣经解析——Rust learn-5(所有权,强大的String)
所有权
Rust 的核心功能(之一)是 所有权(ownership),Rust 通过所有权系统管理内存,编译器在编译时会根据一系列的规则进行检查。如果违反了任何这些规则,程序都不能编译。在运行时,所有权系统的任何功能都不会减慢程序。
栈和堆
这两个概念可以说是非常经典,在Rust中我们应该比其他语言考虑和理解这两个概念更多
相同点
栈和堆都是代码在运行时可供使用的内存
栈
- 栈中的所有数据都必须占用已知且固定的大小
- 后进先出
- 存储速度块
堆
- 存储在编译时大小未知或大小可能变化的数据
- 存储时会需求一块尽可能大的内存区域
- 指针指向,访问慢
所有权规则
- Rust 中的每一个值都有一个 所有者(owner)。
- 值在任一时刻有且只有一个所有者。
- 当所有者(变量)离开作用域,这个值将被丢弃。
请大家牢牢记住这三大规则,因为如果你刚接触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()