rust笔记

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值