跳到主要内容

Rust

数据类型

标量类型

  1. 存在栈上
  2. 实现了 Copy trait, 赋值直接内存拷贝

char

4字节, 表示一个 Unicode 标量值

复合类型

元组

  1. 不同类型值组合
  2. 一旦声明, 长度不可变
  3. 存在栈上, 包含堆分配的数据时存指向堆的指针

数组

  1. 相同类型值组合
  2. 一旦声明, 长度不可变
  3. 存在栈上, 避免过长防止运行时栈溢出

所有权

离开作用域时, 堆上的值 和它在 栈上的所有者 都会被drop

借用

值的不可变引用被使用前, 不能创建它的可变引用

Slice

集合的不可变引用

字符串 Slice

  1. 类型是 &str
  2. 字符串切片的切片, 无法修改底层数据

字符串字面值

  1. 类型是 &str
  2. 硬编码在二进制文件的 只读数据段
  3. slice 的指针指向只读数据段

数组 Slice

  1. 类型有 &[i32]

集合

Vec

  1. 存放相同类型值
  2. 长度可变
  3. 借助 enum 存放多种类型
  4. 栈上存指针,长度,容量, 堆上存数据
  5. 赋值时, 拷贝栈上数据, 堆上所有权转移

String

  1. 有所有权
  2. 可变
  3. UTF8 编码
  4. 存在堆上
  5. &String 是拥有所有权字符串的切片, &mut String 可以修改底层数据
提示

Unicode 为世界上所有字符分配了 码点, UTF8 决定 码点 在磁盘占几个字节

1. println!()

  1. 不会获取参数所有权
  2. {}中不支持字段访问或方法调用, 需要使用位置参数
println!("this is {}", config.query);

2. format!()

不会获取参数所有权


thiserror

便捷地创建自定义错误类型

anyhow

  1. 在向上抛出错误时, 可以通过 Context 添加业务描述
  2. 错误在线程间传递时, 已经包含 Send + Sync 约束, 保证了线程安全
  3. 一次性错误消息支持插值 return Err("Missing attribute: {}", missing);