Rust 学习笔记
安装
cargo
- 创建项目 cargo new hello_cargo
- 可以使用 cargo build 构建项目。
- 可以使用 cargo run 一步构建并运行项目。
- 可以使用 cargo check 在不生成二进制文件的情况下构建项目来检查错误
常见概念
变量与可变性
变量
- 变量默认是不可改变的(immutable),当变量不可变时,一旦值被绑定一个名称上,你就不能改变这个值
- 尽管变量默认是不可变的,你仍然可以在变量名前添加 mut 来使其可变
常量
- 类似于不可变变量,常量(constants) 是绑定到一个名称的不允许改变的值
- 不允许对常量使用 mut。常量不光默认不能变,它总是不能变
- 声明常量使用 const 关键字而不是 let,并且 必须 注明值的类型
- 常量只能被设置为常量表达式,而不可以是其他任何只能在运行时计算出的值
- Rust 对常量的命名约定是在单词之间使用全大写加下划线
隐藏 shadowing
我们可以定义一个与之前变量同名的新变量。
Rustacean们称之为第一个变量被第二个 隐藏(Shadowing) 了,这意味着当您使用变量的名称时,编译器将看到第二个变量。实际上,第二个变量“遮蔽”了第一个变量,此时任何使用该变量名的行为中都会视为是在使用第二个变量,直到第二个变量自己也被隐藏或第二个变量的作用域结束。可以用相同变量名称来隐藏一个变量,以及重复使用 let 关键字来多次隐藏
- 当再次使用 let 时,实际上创建了一个新变量,我们可以改变值的类型,并且复用这个名字
数据类型
我们将看到两类数据类型子集:标量(scalar)和复合(compound)
Rust 是 静态类型(statically typed)语言,也就是说在编译时就必须知道所有变量的类型。根据值及其使用方式,编译器通常可以推断出我们想要用的类型。当多种类型均有可能时,比如第二章的 “比较猜测的数字和秘密数字” 使用 parse 将 String 转换为数字时,必须增加类型注解
标量类型
Rust 有四种基本的标量类型:整型、浮点型、布尔类型和字符类型。
整型
有符号整数类型以 i 开头而不是 u,有符号 和 无符号 代表数字能否为负值,
| 长度 | 有符号 | 无符号 |
|---|---|---|
| 8-bit | i8 | u8 |
| 16-bit | i16 | u16 |
| 32-bit | i32 | u32 |
| 64-bit | i64 | u64 |
| 128-bit | i128 | u128 |
| arch | isize | usize |
- 每一个有符号的变体可以储存包含从 -(2n - 1) 到 2n - 1 - 1 在内的数字,这里 n 是变体使用的位数。所以 i8 可以储存从 -(27) 到 27 - 1 在内的数字,也就是从 -128 到 127。无符号的变体可以储存从 0 到 2n - 1 的数字,所以 u8 可以储存从 0 到 28 - 1 的数字,也就是从 0 到 255。
- isize 和 usize 类型依赖运行程序的计算机架构:64 位架构上它们是 64 位的, 32 位架构上它们是 32 位的
- 允许使用 _ 做为分隔符以方便读数
- 整型溢出 debug模式报错, release 进行二进制补码包装
- 整数除法会向下舍入到最接近的整数
浮点型
Rust 的浮点数类型是 f32 和 f64,分别占 32 位和 64 位。默认类型是 f64。
- 所有的浮点型都是有符号的
- f32 是单精度浮点数,f64 是双精度浮点数。
布尔类型
true 和 false。Rust 中的布尔类型使用 bool 表示。例如:
字符类型
char 类型是语言中最原生的字母类型
- 我们用单引号声明 char 字面量,而与之相反的是,使用双引号声明字符串字面量
- Rust 的 char 类型的大小为四个字节(four bytes),并代表了一个 Unicode 标量值
复合类型
复合类型(Compound types)可以将多个值组合成一个类型。Rust 有两个原生的复合类型:元组(tuple)和数组(array)
元组类型
元组是一个将多个其他类型的值组合进一个复合类型的主要方式。元组长度固定:一旦声明,其长度不会增大或缩小
- 我们使用包含在圆括号中的逗号分隔的值列表来创建一个元组。
- 元组中的每一个位置都有一个类型,而且这些不同值的类型也不必是相同的
- 为了从元组中获取单个值,可以使用模式匹配(pattern matching)来解构(destructure)元组值,我们也可以使用点号(.)后跟值的索引来直接访问它们
- 跟大多数编程语言一样,元组的第一个索引值是 0。
- 不带任何值的元组有个特殊的名称,叫做 单元(unit) 元组。这种值以及对应的类型都写作 (),表示空值或空的返回类型。如果表达式不返回任何其他值,则会隐式返回单元值。
数组类型
另一个包含多个值的方式是 数组(array)。与元组不同,数组中的每个元素的类型必须相同,Rust中的数组长度是固定的