枚举类型
结构体
在Rust中,Self和self有不同的含义和用途。
- Self是一个类型别名,它代表了当前实现块(impl)所关联的类型。在你的代码中,Self就代表了Drink类型。 可以在方法返回类型或者关联函数中使用Self,来表示返回当前类型的实例。
- self是方法的第一个参数,它代表了调用该方法的实例。 self可以有三种形式:self,&self和&mut self,分别代表了值、引用和可变引用
结构体与所有权
每当将值从一个位置传递到另一个位置时,borrow checker都会重新评估所有权。
- Immutable Borrow使用不可变的借用,值的所有权仍归发送方所有,接收方直接接收对该值的引用
而不是该值的副本。但是,他们不能使用该引用来修改它指向的值,编译器不允许这样做。释放资源的
责任仍由发送方承担。仅当发件人本身超出范围时,才会删除该值
- Mutable Borrow使用可变的借用所有权和删除值的责任也由发送者承担。但是接收方能够通过他们
接收的引用来修改该值。
- Move这是所有权从一个地点转移到另一个地点。borrow checker关于释放该值的决定将由该值的接
收者(而不是发送者)通知。由于所有权已从发送方转移到接收方,因此发送方在将引用移动到另一个
上下文后不能再使用该引用,发送方在移动后对vlaue的任何使用都会导致错误。
堆栈与copy和move
Box:智能指针
Box是一个智能指针,它提供对堆分配内存的所有权。它允许你将数据存储在堆上
而不是栈上,并且在复制或移动时保持对数据的唯一拥有权。使用Box可以避免一
些内存管理问题,如悬垂指针和重复释放。
- 所有权转移
- 释放内存
- 解引用
- 构建递归数据结构
copy与clone
Move:所有权转移
Clone:深拷贝
Copy:Copy是在Cl one的基础建立的narker trait(Rust中最类似继承的关系)
- trait(特质)是一种定义共享行为的机制。Cl one也是特质
- marker trait是一个没有任何方法的trait,它主要用于向编译器传递某些信息,以改变类型的默认行为
堆和栈与Copy和Move
stack
1. 基础类型
2. tuple和array
3. struct与枚举等也是存储在栈上如果属性有String等在堆上的数据类型会有指向堆的
heap
Box Rc String/Vec等
一般来说在栈上的数据类型都默认copy,但struct等默认为move,需要Copy只需要设置数据类型实现Copy特质即可,或是调用CI one函数(需要实现Clone特质)
if 与 match
循环与break、continue以及迭代的区别
- break关键字用于立即终止循环,并跳出循环体
- 可以用于跳出指定标签循环
- continue关键字用于立即跳过当前循环中剩余的代码,直接进入下一次循环
loop 为无限循环
函数
函数基础与copy值
1. Struct、枚举、集合等并没有实现Copy trait,会实现move操作失去所有权
2. 为数据类型实现Copy trait,就可实现Copy by value
函数不可变借用、可变借用
函数返回值与所有权机制
返回Copy与Non-Copy
都可以返回,但是要注意Non-Copy是在堆上的
性能:
在一般情况下,返回Copy类型的值通常具有更好的性能。这是因为Copy类型
的值是通过复制进行返回的,而不涉及堆上内存的分配和释放,通常是在栈上分配。
这样的操作比涉及堆上内存的分配和释放更为高效。
返回引用
- 在只有传入一个引用参数,只有一个返回引用时,生命周期不需要声明
- 其他情况下需要声明引用的生命周期
- 慎用‘static
高阶函数(函数作为参数与返回值)
- map函数:
map函数可以用于对一个集合中的每个元素应用一个函数,并
返回包含结果的新集合。
- filteri函数:
filter函数用于过滤集合中的元素,根据一个谓词函数的
返回值。
- fold:
fold函数(有时也称为reduce)可以用于迭代集合的每个元素,
并将它们累积到一个单一的结果中。
错误处理
Rust中的错误可以分为两种
- Recoverable error:有返回类型
- 返回Result类型
- 返回opt ion类型
- Unrecoverable type:没有返回类型,直接崩溃
- panic macro将终止当前线程
Result、Option 和 panic!宏


错误结果处理: unwrap() 与 "?"



自定义 Error 类型
1. 定义错误类型结构体:创建一个结构体来表示你的错误类型,通常包含一些字段来描述错误的详细信息。
2. 实现std::fmt::Display trait: 实现这个trait以定义如何展示错误信息。这是为了使错误能够以人类可读的方式打印出来。
3. 实现std:error::Error trait: 实现这个trait以满足Rust的错误处理机制的要求。
借用与生命周期


生命周期与函数
悬垂引用

编译器推断生命周期三个规则

生命周期与结构体
- 在结构体中的引用需要标注生命周期
- 结构体的方法(&self等)不需要标注生命周期
- 作者:esword
- 链接:https://blog.esword.cn//article/c494aea6-d921-456f-a74c-1893b948dce1
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。



