Rust学习记录 | Peanuts' Blog

Rust学习记录

一门赋予每个人构建可靠且高效软件能力的语言

引用

  • 在任意给定时间,要么 只能有一个可变引用,要么 只能有多个不可变引用。
  • 引用必须总是有效的。

生命周期省略规则

函数或方法的参数的生命周期被称为输入生命周期 (input lifetimes),而返回值的生命周期被称为输出生命周期 (output lifetimes)

  • 每一个是引用的参数都有它自己的生命周期参数
  • 如果只有一个输入生命周期参数,那么它被赋予所有输出生命周期参数
  • 如果方法有多个输入生命周期参数,不过其中之一因为方法的缘故为&self&mut self那么self的生命周期被赋给所有输出生命周期参数

Fn trait

  • FnOnce 消费从周围作用域捕获的变量,闭包周围的作用域被称为其 环境,environment。为了消费捕获到的变量,闭包必须获取其所有权并在定义闭包时将其移动进闭包。其名称的 Once 部分代表了闭包不能多次获取相同变量的所有权的事实,所以它只能被调用一次。
  • FnMut 获取可变的借用值所以可以改变其环境
  • Fn 从其环境获取不可变的借用值

孤儿规则

只有当 trait 或者要实现 trait 的类型位于 crate 的本地作用域时,才能为该类型实现 trait。不能为外部类型实现外部 trait。

Option用法记录

  • Some(T).unwrap()会移入变量的所有权,正确的做法是Some(T).as_ref().unwrap(),将&Option<T>转为Option<&T>

Rc/Arc 用法记录

  • Rc相当于添加了一层引用计数,但不是包裹值,所以不需要unwrap()的类似操作

Cell/RefCell 用法记录

  • RefCell的存在主要是为了引入内部可变性,在编译时编译器将不会检查,取而代之的是在运行时检查
  • RefCell的借用有两种:borrow()borrow_mut(),区别是可变性

选择不同的指针

  • Rc<T>允许相同数据有多个所有者;Box<T>RefCell<T> 有单一所有者。
  • Box<T> 允许在编译时执行不可变或可变借用检查;Rc<T>仅允许在编译时执行不可变借用检查;RefCell<T> 允许在运行时执行不可变或可变借用检查。
  • 因为 RefCell<T> 允许在运行时执行可变借用检查,所以我们可以在即便 RefCell<T> 自身是不可变的情况下修改其内部的值