rust的char占4个字节,是unicode标量值
break <val>可以从循环中返回值
循环标签要以单引号开头'<label>,break '<label>或continue '<label>可跳到标签处
Copy trait 实现在栈变量上,Drop trait 实现在堆变量上,因此Copy trait 和 Drop trait 互斥
引用的范围从引入它的位置开始,持续到最后使用它的位置
命名元组
struct Color(i32, i32, i32);
struct Point(i32, i32, i32);
fn main() {
let black = Color(0, 0, 0);
let origin = Point(0, 0, 0);
}空结构,不需要括号
struct AlwaysEqual;
fn main() {
let subject = AlwaysEqual;
}<var>实现Debug trait后:
println!("{:?}", <var>)宏引用<var>,输出到stdoutdbg!(<var>)宏移动<var>并返回新值,输出到stderr
getter方法:impl中的方法名允许和某字段名相同
方法的&self参数:
- reading (
&self) - mutating (
&mut self) - consuming (
self)
enum 可嵌入各种类型:
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColor(i32, i32, i32),
}
crate一般指库(library crate),有时指可执行文件(binary crate)
cargo最多只能包含1个library crate,可以包含任意多个binary crate
pub <struct> { ... }的所有字段还是私有的,要单独pub字段
pub <enum> { ... }的所有字段都是公有的
use语句只在它所在的模块中发挥作用
不可恢复的错误panic!、可恢复的错误Result<T,E>
expr?在Result<T,E>上调用,会用 From trait 将错误转成需返回的错误类型
expr?在Option<T>上也可调用
main 函数也可以返回 Result<(), E>
rust在编译时将泛型代码单态化(转为特定代码)
trait
只有当 trait 或类型定义于我们的库中时,才能为该类型实现对应的 trait
生命周期
生命周期也是泛型的一种,用来确保引用在我们的使用过程中一直有效 生命周期语法关联一个函数中不同参数及返回值的生命周期
// 返回的引用的生命周期与传入的引用的生命周期中较短的那个相同
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() {
x
} else {
y
}
}可以在struct中存储引用,struct中的每一个引用都要添加生命周期标注
生命周期省略规则
- 每一个引用输入参数都有自己的生命周期参数。
- 当只有一个输入生命周期参数时,这个生命周期参数会被赋给所有的输出生命周期参数。
- 当有多个输入生命周期参数,且其中一个是
&self或&mut self时,self的生命周期会被赋给所有的输出生命周期参数。
测试
属性#[test]将函数转变为测试函数
属性#[should_panic(expected = "xxx")]测试panic抛出
闭包
每一个闭包实例都有它自己的匿名类型。即使两个闭包拥有完全相同的签名,它们的类型也被认为不一样。
三种Fn trait对应函数接收参数的三种方式:
FnOnce:消耗FnMut:可变引用- Fn:不可变引用
大部分情况下,当你需要指定某一个Fn系列的trait时,可以先尝试使用Fn trait,编译器会根据闭包体中的具体情况来告诉你是否需要FnMut或FnOnce。
智能指针
Deref trait
- 当
T: Deref<Target=U>时,允许&T或&mut T转换为&U - 当
T: DerefMut<Target=U>时,允许&mut T转换为&mut U
Drop trait
自动调用drop trait
fn drop(&mut self)用drop()(在预导入模块std::mem中)提前丢弃值
内部可变性
内部可变性(interior mutability)是rust的设计模式之一,它允许你在只持有不可变引用的前提下对数据进行修改。
使用RefCell<T>在运行时检查借用规则
多态
trait对象实现多态,如Box<dyn Draw>或&dyn Draw
trait对象必须是对象安全的:
- 方法的返回类型不是
Self - 方法中不含任何泛型参数 因为rust无法在使用时确定这个trait对象的具体类型
模式语法
通过_开头的名称忽略未使用的变量
_x语法将值绑到了变量上(所有权转移),而_则不会绑定
用..忽略值的剩余部分
参考
HRTB
for<'a> can be read as “for all choices of 'a“,
ref