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>,输出到stdout
  • dbg!(<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中的每一个引用都要添加生命周期标注

生命周期省略规则

  1. 每一个引用输入参数都有自己的生命周期参数。
  2. 当只有一个输入生命周期参数时,这个生命周期参数会被赋给所有的输出生命周期参数。
  3. 当有多个输入生命周期参数,且其中一个是&self&mut self时,self的生命周期会被赋给所有的输出生命周期参数。

测试

属性#[test]将函数转变为测试函数

属性#[should_panic(expected = "xxx")]测试panic抛出

闭包

每一个闭包实例都有它自己的匿名类型。即使两个闭包拥有完全相同的签名,它们的类型也被认为不一样。

三种Fn trait对应函数接收参数的三种方式:

  • FnOnce:消耗
  • FnMut:可变引用
  • Fn:不可变引用

大部分情况下,当你需要指定某一个Fn系列的trait时,可以先尝试使用Fn trait,编译器会根据闭包体中的具体情况来告诉你是否需要FnMutFnOnce

智能指针

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