rust bible
2.1
解构式赋值
- 可以在结构体中解构得到变量值
2.2
2.2.1
to_bits()
2.2.2
- 单元类型
()
不占内存'
2.2.4
snake_case
- 用发散函数替代返回None不会返回任何值,因此它们可以用于替代需要返回任何值的地方?发散函数作用是什么鸭?往往会用作导致程序崩溃的函数
2.3
2.3.1
let (ref s1, ref s2) = &&&&&t;
这里的解构规则?
2.3.2
- NLL(Non-Lexical Lifetimes),专门用于找到某个引用在作用域(})结束前就不再被使用的代码位置。
2.4
2.4.1
-
对于切片,比如str和[i32]等,不能够直接使用,可以使用的是切片的引用,比如&[i32],&str等
-
OsStr表示被借用的变量,CsStr表示具有所有权的变量
-
&Stringderef cocerion转换为&str
-
字符串追加push()方法,追加char
-
对与
+
运算符,其实是调用了add方法
2.4.3
dbg!宏
还会返回表示式的求值结果单元结构体
和单元类型
不一样
2.4.4
- 枚举值与枚举对象不一致
2.4.5
- rust的数组是存储在栈上
2.8
2.8.1
- ,[T]切片类型?
- 泛型实现的是静态派发的单态化,那么这里arrays数组第一个元素就决定好了数据元素的类型
- 这里指定的是Add Trait的关联类型Output的类型
- 对于assert!宏中的参数,需要实现Debug trait
2.8.3
- dyn 关键字只用在特征对象的类型声明上,在创建时无需使用 dyn?
- 只有对象安全的特征才可以拥有特征对象
2.8.4
- newtype轻易打破了孤儿规则,那孤儿规则有啥用?其实还是对应新的类型实现了trait,其封装的类型还是没实现trait
2.9
- 标准库的集合类型,都是分配在堆上
String::from_raw_parts(ptr, len, capacity)
,通过String的三个成员构造String,这个时候会发生double free,所以必须将之前的String装到ManuallyDrop
中
2.9.2
- 密码学安全Hash可以防止拒接服务攻击?&te
- 实现Eqtrait需要先实现PartialEq?
2.10
- 接收器是指(self,&self,&mut self参数)
Transmutes
可以将两个占用字节数相同的类型实现转换- 切片引用(或者说切片指针)知道其指向的元素类型,不过这个元素类型在哪里存储,应该是转化成了汇编,汇编层面可以体现元素的类型大小,但是这个切片引用存储的大小字段还是13?c语言中的指针就是通过编译器转换其中的类型为`dword,
2.11
?
会被from转换成当前返回类型所定义的错误类型- 只要实现了
Display
的trait,那么就会自动实现ToString
traitfmt方法,使用write!实现Display的,这个&mut fmt::Formatter应该是一个缓冲区 - 对于
?
,其只能返回错误的值None
,如果是正确的值,其会返回Some(T)中的T - Result的map的作用是Result<T, E>转换为Result<U, E>;Option的map的作用是Option
转换为Option对于Option 中的元素T修改成 and_then(f)
是将包裹的值传递到f中,并返回结果and_then(f)
与map(f)
的区别在于,and_then(T)
会取出其中数据,而map(f)
不会”取出“
2.12
2.12.1
- 这里的这个二进制包(crate)的根文件,一个
Package
只可以包含一个库(library)类型的crate,以及多个二进制可执行类型的crate
2.12.1
- 如对于结构体,如果其被设置为pub,它的所有字段依旧不可见;而对于枚举,则相反
- 对于模块与文件的分离,可以将一个模块的实现放到一个单独文件,将声明放在原来的src/lib.rs通过mod front_of_house加载进来。
3.3
3.3.2
- 使用
into_boxed_str()
,这里不是一样不知道str的大小吗?
3.4
3.4.1
- 使用
Box::leak()
可以强制将一个String类型转换为&‘static str 类型Box的背后调用的是jemalloc(一个通用malloc的实现)
3.4.2
* 不会无限递归替换,从 *y 到 *(y.deref()) 只会发生一次,而不会继续进行替换然后产生形如 *((y.deref()).deref()) 的怪物。
是指*解引用调用deref()之后不会继续调用deref()- 仅引用类型的实参才会触发自动解引用
- 此处的&self就是
&&T
类型
3.4.3
- 复制一份,就drop一份,为啥需要考虑析构函数执行的时间与频率呢?