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>
自身是不可变的情况下修改其内部的值