rust 学习梳理
数据类型
- 基于已明确的类型,Rust会推断剩下大部分类型。基于类型推断Rust具备了与动态类型语言近似的易读性,并仍能在编译期捕获类型错误。
- 函数可以是泛型的:单个函数ujiu可以处理不同类型的值。
- Rust的类型根基是一组固定宽度的数值类型,匹配几乎所有现代处理器直接硬件实现的类型。固定宽度可能丢失精度(u8 u16 u32 u64 u128 usize[有符号同理],f32,f64)
- usize 和 isize是与目标机器地址空间保持一致
- bool类型在rust用整字节表示
- 字符类型用32位来表示单个Unicode字符
- 元组类型中,每个元素有不同的类型;元组中只能用常量索引其中元素(t.1)。常用于在函数中返回多个值。可以用作一个小巧的结构体类型。
- 指针类型:Rust有多种可以表示地址的类型(引用,Box,裸指针)
- Rust的引用永远不会为空,Rust会跟踪值的所有权和生命周期,在编译器排除了悬空指针、双重释放、指针失效等错误。
- Rust的引用分为不可变和可变。
- Box是分配在堆上的引用类型。
- 裸指针是不安全的,Rust不会跟踪它指向的内容。只能在Unsafe块中对裸指针解引用。
- Rust用三种类型表示值序列(数组,向量,切片)
- 数组是相同类型,确定大小的序列,不能追加或缩小。向量(vector)是动态分配可增长的相同类型的序列,元素存在堆中。切片是引用了数组或向量的一部分。
- 切片是任意长度,对切片的应用是一个胖指针,双字值,包括第一个元素的指针和切片中元素的数量。
- 函数以切片引用为参数,可以给它传入向量或数组,很多向量和数组的方法都是在切片上定义的。&[T]。可以使用范围值获取数组或向量一段区域(&a[2..6])
- 字符串原始表达:r"/root/ddd"。
- 可以在字符串前加入原始记号#,可以根据需求增加多个#来表示原始字符串开始与结束(r###"this is a raw string ### "也可以是原始字符",结束了"###)
- 字节串是用b表示:b"abcd",这是一个u8类型的数组。字节串不能包含unicode字符,只能用ascii和\xHH转义序列。
- 在内存中,字符串都是unicode字符,由于是可变字节编码,所以或占用多个字节。ascii编码会存储在一个字节中。
- &str很像&[T],而String类似与Vec
String
创建String的方法
- .to_string() 将&str转换为String。这会复制字符串。.to_owned()会做同样的事情,只是命名风格适用与另一些类型
- format!()会返回一个新的String.
- 字符串的数组,切片和向量都有的两个方法:.concat()和.join(sep)。会形成新的String
所有权和生命周期
在Rust中,所有权是语言本身的特性,通过编译器强制检查执行。每个值斗殴与决定其生命的唯一拥有者,当拥有者被释放时,它拥有的值也同时被释放,rust中叫做丢弃。
凡是超出作用域的类型,它所拥有的值将被抛弃。
拥有者与它拥有的那些值形成了一课树,每棵树的总根都是一个变量,当该变量超出作用域时,整棵树都会随之消失。
- 可以将值从一个拥有者转移给另一个拥有。这允许构建,重新排列和拆除树形结构。
- 整数、浮点数、字符、bool类型的简单类型,不受所有权规则约束,这些被称为Copy类型
- 标准库提供了引用计数指针类型 Rc和Arc,允许值在某些限制下有多个拥有者。
- 可对值进行借用,获得值的引用。这种引用是非拥有型指针,有受限生命周期
移动
变量的赋值,传递给函数,或者函数返回,这样的操作会带来所有权的移动,也就是由目标变量来获得值的控制权,获得新的生命周期,构建新的所有权树。
而源变量将会变为未初始化状态,无法被使用。
从一个Vec 中获得某一个string,直接取值会报错,没有实现Copy trait。建议是访问其中的元素使用引用而不是移动它。
如果真的要从Vec取出一个字符串,但Rust是不会将Vec的某一个元素设置为未初始化状态。因此需要一些操作:
- 从vec弹出一个值:v.pop()
- 指定索引处与最后一个值互换,把前者移出:v.swap_remove(1)
- 取出一个值与另一个值互换:std::mem::replace(&mut v[2],"abcdefg".to_string())
移出一个Option ,将其与None互换: std::mem::replace(&mut v[2],None)。实际上专门提供了一个方法实现:v[2].take()。
对于Copy类型,移动就是复制值。
在Rust中,每次移动都是字节级别的一对一浅拷贝,并让源变为未初始化。只有那些可以通过简单复制位来复制其值的类型才能作为Copy类型,任何在丢弃时需要做特殊操作的类型都不能是Copy类型。
共享所有权
rc和arc(线程安全)。Rust的内存和线程安全保证:确保不会有任何值是既共享又可变。Rc和Arc是不可变共享引用。