Rust 权威指南
通过实现 Deref,我们可以将智能指针视作常规引用来进行处理。
- 这也就意味着,原本用于处理引用的代码可以不加修改地用于处理智能指针。
Box<T>
能够进行解引用操作:
|
|
解引用转换(deref coercion)是 Rust 为函数和方法的参数提供的一种便捷特性。当某个类型 T 实现了 Deref trait 时,它能够将 T 的引用转换为 T 经过 Deref 操作后生成的引用。当我们将某个特定类型的值引用作为参数传递给函数或方法,但传入的类型与参数类型不一致时,解引用转换就会自动发生。编译器会插入一系列的 deref 方法调用来将我们提供的类型转换为参数所需的类型。
Rust 通过实现解引用转换功能,使程序员在调用函数或方法时无须多次显式地使用 &
和 *
运算符来进行引用和解引用操作。这一特性还使我们可以更多地编写出能够同时作用于常规引用和智能指针的代码。
Rust 会在类型与 trait 满足下面 3 种情形时执行解引用转换:
- 当
T: Deref<Target=U>
时,允许&T
转换为&U
- 当
T: DerefMut<Target=U>
时,允许&mut T
转换为&mut U
- 当
T: Deref<Target=U>
时,允许&mut T
转换为&U
Rust 会将一个可变引用自动地转换为一个不可变引用。但这个过程绝对不会逆转,也就是说不可变引用永远不可能转换为可变引用。
Drop trait 允许我们在变量离开作用域时执行某些自定义操作。
Drop trait 要求实现一个接收 self 可变引用作为参数的 drop 函数。
如果必须要提前清理一个值,我们就需要使用 std::mem::drop
函数。
std::mem::drop
函数不同于 Drop trait 中的 drop 方法。我们需要手动调用这个函数,并将需要提前丢弃的值作为参数传入。
|
|
我们为什么睡觉
判断自己的常规睡眠是否充足,一个较为容易的经验性方法就是回答两个简单的问题:
- 早上醒来后,你能在上午 10 点或 11 点再次睡着吗?
- 在中午之前,你能不能在不摄入咖啡因的情况下保持最佳状态?
睡眠不足的其他迹象:
- 如果没有设置闹钟,会睡过头
- 发现在电脑屏幕上需要重复阅读同一句话
- 有时会忘记刚刚开车经过的几个交通信号灯都是什么颜色
由睡眠研究人员开发的调查问卷,可以帮你确定自己的睡眠状况等级: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3902880/
- 它叫 SATED,很容易完成,只有五个简单的问题。
丘脑是一个光滑的椭圆状结构,比一个柠檬还还要小,它是大脑的感觉入口。丘脑决定了哪些感官信号可以通过入口,哪些不可以。
梦中感受到的时间膨胀,甚至会长于睡眠本身。梦中的时间并不是真正的时间,它通常被拉长了。
快速眼动睡吗(REM)是人类主要做梦的阶段。
人类睡眠不仅是睡觉,而是两种完全不同的睡眠模式在交替循环。他们根据典型的眼部特征来命名这两种睡眠阶段:非快速眼动(NREM)睡眠和快速眼动(REM)睡眠。
非快速眼动睡眠划分为四个独立的阶段
快速眼动睡眠中,大脑的活动几乎与清醒时相同,并且与我们称之为梦的经历联系密切,因此也通常被称为有梦睡眠
睡眠分为两个阶段:非快速眼动睡眠和快速眼动睡眠,每 90 分钟就会发生一次转换。
到目前为止,对非快速眼动-快速眼动睡眠周期长期预测的最佳指标是脑干的宽度,脑干越宽的物种睡眠周期越长。
睡眠时相序列图:
在前半夜我们 90 分钟的周期中大部分时间都是由深度的非快速眼动睡眠所占据的,而快速眼动睡眠很少。当我们进入后边夜的时候,这种交替性的平衡发生了变化,大部分时间都是由快速眼动睡眠所主导,几乎没有深度的非快速眼动睡眠了。
在前半夜占主导的深度非快速眼动睡眠的一个关键功能是淘汰和去除不必要的神经连接。相比之下,在晚些时候开始占上风的快速眼动睡眠的做梦阶段,则在加强这些连接方面起着重要作用。