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,那么就会自动实现ToStringtraitfmt方法,使用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一份,为啥需要考虑析构函数执行的时间与频率呢?
posted @ 2022-07-06 23:06  抿了抿嘴丶  阅读(44)  评论(0编辑  收藏  举报