感想:rust还是得多上手实践才行
一些笔记如下:
Variables
Rust中变量有严格的初始化要求
在 Rust 中,变量的类型是静态类型的
可以使用隐藏,重新声明一个变量来更改其类型
const声明常量,且必须包括类型
Primitive Types
数组切片,切片是引用,&a[1..5]
元组按索引寻址,x.0
Vectors
初始化vec的宏为vec![]
vec2.rs,遍历vec
Move Semantics
使用vec.clone()可以创造一个新的对象
在任何给定时间点,你只能拥有一个可变引用(不转移所有权的情况下修改数据)
String类型的所有权
Structs
三种结构体初始化方法
从另一个结构体更新{..user}
Enums
定义枚举时可以将数据附加到枚举成员中,类似于结构体
match匹配时要加入结构体成员数据类型
Strings
可以用+号连接字符串
区分&str和String
Modules
默认为private
借用与结构体中的声明
Options
if let语句
Errors
传播错误使用?, 出现错误直接抛出,需要与返回值兼容
Box
智能指针与Trait unwrap和expect可以解开Ok中的值或者报错
Generics
泛型,在方法处也是impl
Traits
类似于Java中的接口和C++中的抽象类
Trait可以用作参数来标识实现了Trait的类型 impl Trait和&dyn Trait,前者接受拥有所有权的实现类型,后者接受对实现该类型的不可变引用,可以用+号指定多个Trait,impl Trait1 + Trait2
Lifetime
确保引用有效,不出现悬垂引用
需要在函数名处先定义,然后再引用,结构体中也是如此
Tests
使用#[should_panic]来检查panic
Iterators
iterators3.rs 函数式
collect::Type 显式确定要收集的类型
(1..=num).fold(1, |acc, x| acc * x)
map, filter, sum
Smart Pointers
ref with some metadata and capabilities
普通引用是借用,在大部分情况下,智能指针 拥有 它们指向的数据
实现了deref和drop的trait
Box
,解决循环类型定义,因为编译时需要确定数据空间占用 Rc
,Solar System: Planet and the Sun Cow,灵活地确定借用还是拥有
Threads
thread::spawn(move || {})
Macros
使用macro_rules!声明宏
#[macro_export]导出宏