Rust 学习笔记

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的方法

  1. .to_string() 将&str转换为String。这会复制字符串。.to_owned()会做同样的事情,只是命名风格适用与另一些类型
  2. format!()会返回一个新的String.
  3. 字符串的数组,切片和向量都有的两个方法:.concat()和.join(sep)。会形成新的String

所有权和生命周期

在Rust中,所有权是语言本身的特性,通过编译器强制检查执行。每个值斗殴与决定其生命的唯一拥有者,当拥有者被释放时,它拥有的值也同时被释放,rust中叫做丢弃。

凡是超出作用域的类型,它所拥有的值将被抛弃。

拥有者与它拥有的那些值形成了一课树,每棵树的总根都是一个变量,当该变量超出作用域时,整棵树都会随之消失。

  • 可以将值从一个拥有者转移给另一个拥有。这允许构建,重新排列和拆除树形结构。
  • 整数、浮点数、字符、bool类型的简单类型,不受所有权规则约束,这些被称为Copy类型
  • 标准库提供了引用计数指针类型 Rc和Arc,允许值在某些限制下有多个拥有者。
  • 可对值进行借用,获得值的引用。这种引用是非拥有型指针,有受限生命周期

移动

变量的赋值,传递给函数,或者函数返回,这样的操作会带来所有权的移动,也就是由目标变量来获得值的控制权,获得新的生命周期,构建新的所有权树。

而源变量将会变为未初始化状态,无法被使用。

从一个Vec 中获得某一个string,直接取值会报错,没有实现Copy trait。建议是访问其中的元素使用引用而不是移动它。

如果真的要从Vec取出一个字符串,但Rust是不会将Vec的某一个元素设置为未初始化状态。因此需要一些操作:

  1. 从vec弹出一个值:v.pop()
  2. 指定索引处与最后一个值互换,把前者移出:v.swap_remove(1)
  3. 取出一个值与另一个值互换: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是不可变共享引用。

引用

相关推荐
番茄灭世神8 小时前
Rust学习笔记第2篇
rust·编程语言
shimly12345614 小时前
(done) 速通 rustlings(20) 错误处理1 --- 不涉及Traits
rust
shimly12345614 小时前
(done) 速通 rustlings(19) Option
rust
@atweiwei14 小时前
rust所有权机制详解
开发语言·数据结构·后端·rust·内存·所有权
shimly12345614 小时前
(done) 速通 rustlings(24) 错误处理2 --- 涉及Traits
rust
shimly12345615 小时前
(done) 速通 rustlings(23) 特性 Traits
rust
shimly12345616 小时前
(done) 速通 rustlings(17) 哈希表
rust
shimly12345616 小时前
(done) 速通 rustlings(15) 字符串
rust
shimly12345618 小时前
(done) 速通 rustlings(22) 泛型
rust
yezipi耶不耶18 小时前
我在 RTMate 里使用的高并发连接管理利器: DashMap
websocket·rust