Rust 是一种由 Mozilla 领导开发的系统编程语言。它设计的目标是提供内存安全、并发性和高性能。Rust 具有以下一些主要特性:
- 内存安全
- 所有权系统
- 并发性
- 零成本抽象
- 模式匹配
- 没有运行时开销
- 活跃的社区
基本数据类型
- 很大程度上,Rust是围绕其类型设计的。
- Rust对高性能代码的支持,源自它能让开发者原则最适合当前场景的数据表示法,在简单性与成本之间进行合理的权衡。
- Rust的内存和线程安全保障也依赖于Rust类型系统的健全性。
- Rust的灵活性则源自于其泛型类型和特型。
Rust有以下两个特性
- 基于已明确写出的类型,Rust的类型推断会帮你推断出剩下的大部分类型
- 函数可以是泛型的:单个函数就可以处理许多不同类型的值
固定宽度的数值类型
- Rust类型系统的根基是一组固定宽度的数值类型,选用这些类型是为了匹配几乎所有现代处理器都已直接在硬件中实现的类型。 固定宽度的数值类型可能会溢出或丢失精度。
char既不是u8,也不是u32(尽管它确实有32位长)usize类型和isize类型类似于C和C++中的size_t和ptrdiff_t。它们的精度与目标机器上地址空间的大小保持一致, 即在32位架构上是32位长,在64位架构上则是64位长。- Rust要求数组索引是
usize值。 - 可以使用
as运算符将一种整型转换成另一种整型。 - Rust几乎不会执行任何隐式的数值转换,随时可以使用
as运算符写出显式转换。
布尔类型
- Rust非常严格
- 像
if和while这样的控制结构要求它们的条件必须是bool表达式 - 短路逻辑运算符
&&和||也是如此
- 像
字符
- Rust的字符类型
char会以32位值表示单个Unicode字符 - Rust会对单独的字符使用
char类型,但对字符串和文本流使用UTF-8编码 u8是唯一能通过as运算符转换为char的类型
指针类型
- Rust有多种表示内存地址的类型,这是Rust和大多数具有垃圾回收功能的语言之间一个重大差异。
- Rust语言旨在帮你将内存分配保持在最低限度。
引用
- 将引用视为Rust中的基本指针类型
- Rust引用有两种形式
&T: 一个不可变的共享引用&mut T: 一个可变的、独占的引用
- Rust利用共享引用和可变引用之间的"二选一"机制来强制执行"单个写入者或多个读取者"规则
- 你独占读写一个值,或者让任意数量的读取者共享,但二者只能选择其一
- 这种由编译期检查强制执行的"二选一"规则是Rust安全保障的核心
数组、向量和切片
-
Rust用3种类型来表示内存中的值序列
- 类型
[T;N]表示N个值的数 组,每个值的类型为T,N在编译期已经确定,不能追加新元素或缩小数组 - 类型
Vec<T>可称为T的向量,它是一个动态分配且可增长的T类型的值序列 - 类型
&[T]和&mut [T]可称为T的共享切片和T的可变切片
- 类型
-
在数组上看到的那些使用方法都是作为切片而非数组的方法提供的
- 包括:遍历、搜索、排序、填充、过滤等
- Rust在搜索各种方法时会隐式地将对数组的引用转换为切片,因此可以直接在数组上调用任何切片的方法
sort方法实际上是在切片上定义的len方法也是切片的方法之一
-
向量
- 使用
collect时,通常要指定类型,因为它可以构建出不同种类的集合,而不仅仅是向量 - 与数组一样,可以对向量使用切片的方法
reverse方法实际上是在切片上定义的,此调用会隐式地从向量中借用一个&mut [&str]切片并在其上调用reverse
Vec是Rust的基本数据类型,它几乎可以用在任何需要动态大小的列表的地方- 如果事先知道向量所需的元素数量,就可以调用
Vec::with_capacity而不是Vec::new来创建一个向量,它的缓冲区足够大,可以从一开始就容纳所有元素 - 许多库函数会寻求使用
Vec::with_capacity而非Vec::new的机会
- 使用
-
切片
切片是数组或向量中的一个区域- 对 切片的引用是一个
胖指针- 一个双字值
- 包括指向切片
第一个元素的指针和切片中元素的数量
字符串类型
-
字符串字面量
- 原始字符串用小写字母
r进行标记,原始字符串不识别任何转义序列 - 可以再原始字符串的开头和结尾添加
#做标记
- 原始字符串用小写字母
-
字符串
-
带有
b前缀的字符串字面量都是字节串,这样的字节串是u8值(字节)的切片而不是Unicode文本let method = b"POST"; // method类型是&[u8; 4]assert_eq!(method, &[b'P', b'O', b'S', b'T']); -
字节串不能包含任意
Unicode字符,它们只能使用ASCII和\xHH转义序列
-
-
内存中的字符串
- Rust字符串是
Unicode字符序列,但并不以char数组的形式存储在内存中,而是用了UTF-8形式(可变宽度编码) String或&str的.len()方法会返回其长度&mut str类型确实存在,但它没什么用&mut str上唯一可用的操作是make_ascii_uppercase和make_ascii_lowercase,根据定义,它们会就地修改文本并且只影响单字节字符
- Rust字符串是
-
String
&str非常像&[T],是指向某些数据的胖指针- 而
String则类似于Vec<T> - String有几种方法
.to_string()方法会将&str转换为String,这会复制此字符串.to_owned()方法会做同样的事情,也会以同样的方式使用format!()宏的工作方式与println!()类似,但它会返回一个新的String.concat()和.json(sep),字符串数组、切片、向量都有这两个方法,它们会从许多字符串中形成一个新的String
-
其它类似字符串的类型
- 对于
Unicode文本,坚持使用String和&str - 当使用文件名,请改用
std::path::PathBuf和&Path - 当处理根本不是
UTF-8编码的二进制数据时,请使用Vec<u8>和&[u8] - 当使用操作系统提供的原生形式
环境变量名和命令行参数时,请使用OsString和&OsStr - 当和使用
null结尾字符串的C语言库进行互操作时,请使用std::ffi::CString和&CStr
- 对于