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,那么就会自动实现ToStringtrait
fmt方法,使用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一份,为啥需要考虑析构函数执行的时间与频率呢?
![]()





不会返回任何值,因此它们可以用于替代需要返回任何值的地方?发散函数作用是什么鸭?往往会用作导致程序崩溃的函数

对于切片,比如str和[i32]等,不能够直接使用,可以使用的是切片的引用,比如&[i32],&str等








,[T]切片类型?
泛型实现的是静态派发的单态化,那么这里arrays数组第一个元素就决定好了数据元素的类型













fmt方法,使用write!实现Display的,这个&mut fmt::Formatter应该是一个缓冲区
对于Option
这里的这个二进制包(crate)的根文件,一个
通过mod front_of_house加载进来。
Box的背后调用的是jemalloc(一个通用malloc的实现)



浙公网安备 33010602011771号