- 常量的命名规范是使用下划线分隔的大写字母,e.g. const MAX_POINTS: u32 = 100_000;
- 函数和变量名所有字母都是小写并使用下划线分隔单词
- 栈上的数据变量间传递是浅拷贝,并且不传递所有权;堆上数据转移所有权。
- 函数参数与返回值如果是堆上数据也会传递所有权。若要继续使用形参需用引用。
- 可变引用&mut,同一作用域中某变量只有一个可变引用,也不能与不可变引用同时存在,不可变引用有可以多个。
- let s = “Hello, world!”;s 的类型是 &str,&str 是一个不可变引用。
- 函数没有self参数,例如构造器;方法依赖于self。
- 如果一个叫做 foo 的模块没有子模块,应该将 foo 的声明放入叫做 foo.rs 的文件中。
如果一个叫做 foo 的模块有子模块,应该将 foo 的声明放入叫做 foo/mod.rs 的文件中。 - 如果一个项是公有的,它能被任何父模块访问
如果一个项是私有的,它能被其直接父模块及其任何子模块访问 - vec! 宏会根据提供的值来创建一个新的 Vec。
- String的.chars()方法返回单独的 Unicode 标量值,.bytes()返回每一个原始字节。
- zip是一个适配器,他的作用就是将两个迭代器的内容压缩到一起,形成 Iterator<Item=(ValueFromA, ValueFromB)> 这样的新的迭代器;
- enumerate就是把迭代器的下标显示出来(idx, val)
- collect将迭代器里面的所有数据取出,需指定类型
collect::<Vec<_>>();or let v: Vec<_> = (1..20).collect();
- match中& 匹配一个引用并返回它的值,而 ref 匹配一个值并返回一个引用。
- ? 返回 Ok 中的值,或向调用者返回错误,只能被用于返回 Result 的函数。
- 在 impl 之后声明泛型 T ,impl Point {
- 只能在 trait 或对应类型位于我们 crate 本地的时候为其实现 trait。
- 单元测试mod与源码相同的文件中,其前加#[cfg(test)]避免包含进编译结果。fn前加#[test]。UT可测私有函数。
- 集成测试在src同级目录创建一个 tests 目录,tests 目录中的子目录不会被作为单独的 crate 编译测试。
- Rust二进制项目的结构明确采用 src/main.rs 调用 src/lib.rs 中的逻辑的方式,集成测试 就可以 通过 extern crate 测试库 crate 中的主要功能了
if let Some(3) = some_u8_value
与match some_u8_value { Some(3) =>
相同。- 获取环境变量use std::env中的var变量
- Fn 系列 trait 由标准库提供。所有的闭包都实现了 trait Fn、FnMut 或 FnOnce 中的一个。
- FnOnce: 匿名函数内访问的外部变量必须拥有所有权.
FnMut: 匿名函数可以改变外部变量的值.
Fn: 匿名函数只能读取(borrow value immutably)变量值. - iter().map(…)讲迭代器取出的值通过闭包转换成其它值。
- 文档注释使用 ///,位于需要文档的项的之前。//!模块整体提供文档。
- Box<>为对象装箱,实际返回一个智能指针。智能指针都实现Deref与Drop trait。
- Deref trait 允许重载 解引用运算符*
- type关键字定义某个类型的别名。
- 解引用强制多态使得用 MyBox 类型值的引用调用可作为&str使用。
- 不允许自身或其任何部分实现了 Drop trait 的类型使用 Copy trait。copy可以用在存储在栈上的类型以及这些类型的组合。
- 栈上数据赋值不转移所有权。
- 调用 Rc::clone,Rc 中数据的引用计数都会增加。
- RefCell 代表其数据的唯一的所有权。
- 创建线程,需要调用 thread::spawn 函数并传递一个闭包。向线程转移变量所有权thread::spawn(move || {
- 通道传递消息
let (tx, rx) = mpsc::channel(); tx.send(()).unwrap();
会转移所有权,而共享内存类似于多所有权。 - for received in rx {}不再显式调用 recv 函数:而是将 rx 当作一个迭代器。对于每一个接收到的值,我们将其打印出来。当通道被关闭时,迭代器也将结束。
- 通过克隆发送者来创建多个生产者let tx1 = mpsc::Sender::clone(&tx);
- Mutex的所有权不可以转移给其它线程,应使用智能指针 Rc以便拥有多所有者。
- Send 标记 trait 表明类型的所有权可以在线程间传递。
- Sync 标记 trait 表明类型可以安全的在多个线程中拥有其值的引用。
- 可以在函数参数中匹配元组,
foo(&(x, y): &(i32, i32)) let point = (3, 5);foo(&point);
- at 运算符 @ 允许我们在创建一个存放值的变量的同时测试其值是否匹配模式
rust笔记
最新推荐文章于 2025-06-14 09:36:08 发布