Rust 内置丰富的原生类型(Primitives),主要分为标量类型和复合类型两大类。
(一) 标量类型(Scalar Types)
表示单一独立的值,包含 6 类:
- 有符号整型:
i8、i16、i32、i64、i128、isize(长度适配系统指针大小) - 无符号整型:
u8、u16、u32、u64、u128、usize(长度适配系统指针大小) - 浮点型:
f32、f64 - 字符型 char:存储 Unicode 标量值(如
'a'、'α'、'∞'),每个字符占用 4 字节 - 布尔型 bool:仅两个取值
true、false - 单元类型 ():唯一值为空元组
()。虽形式是元组,但因仅含单个值,不属于复合类型。
(二) 复合类型(Compound Types)(末尾会学习)
由多个值组合而成:
- 数组:示例
[1, 2, 3] - 元组:示例
(1, true)
1) 变量类型标注方式
所有变量都可以手动指定类型。 数值类型额外支持后缀标注;未标注时使用默认类型:
- 整数默认:
i32 - 浮点数默认:
f64
Rust 也支持根据代码上下文自动推导类型。
2) 变量类型
1. 显式标注类型
直接在变量名后 : 类型 指定类型,适用于所有变量。
fn main() {
let isOpen: bool = true;
let price: f64 = 1.0;
}Code language: JavaScript (javascript)
上面例子,isOpen 和prince是变量, 后面的: 类型名,就是在变量后面显式指定变量的类型.
2. 数值后缀标注
在数值后加类型后缀指定数值类型,仅针对数字使用。
fn main() {
let an_integer = 5i32;
}Code language: JavaScript (javascript)
这次,没通过:指定变量类型,而是在后面赋值数字的时候,通过i32 指定了是32位整数类型.
3. 类型默认规则
不做任何标注 / 后缀时,编译器使用默认类型:
- 整数字面量 → 默认
i32 - 浮点字面量 → 默认
f64
fn main() {
let default_float = 3.0; // 自动为 f64
let default_integer = 7; // 自动为 i32
}Code language: JavaScript (javascript)
4. 上下文类型推导
编译器可根据后续代码自动推断变量真实类型,无需手动标注。
fn main() {
let mut inferred_type = 12;
inferred_type = 4294967296i64; // 由本行推导出类型为 i64
}Code language: JavaScript (javascript)
可变变量 & 变量特性
1 可变变量
关键字 mut 修饰的变量,值可以被修改。
fn main() {
let mut mutable = 12;
mutable = 21; // 合法,修改值
}Code language: JavaScript (javascript)
2 类型不可变更
变量一旦确定类型,全程无法更改,修改为其他类型会直接编译报错。
fn main() {
let mut mutable = 12;
mutable = 21; // 合法,修改值
mutable = true; // 报错:原类型为 i32,不能赋值 bool
}Code language: JavaScript (javascript)
C:\Users\Jack\Desktop\rustdemo>rustc hello.rs
error[E0308]: mismatched types
--> hello.rs:5:12
|
3 | let mut mutable = 12;
| -- expected due to this value
4 | mutable = 21; // 合法,修改值
5 | mutable = true; // 报错:原类型为 i32,不能赋值 bool
| ^^^^ expected integer, found `bool`
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0308`.Code language: JavaScript (javascript)
注意
在rust中,变量的值默认是不能变的,如果你要希望它可以变,则需要加上mut关键字,这点和其他语言有点不一样.
例如下面代码:在其他语言很常见,但是在rust就报错
fn main() {
let mutable:i32 = 12;
mutable = 21; // 合法,修改值
}Code language: JavaScript (javascript)
编译错误
C:\Users\Jack\Desktop\rustdemo>rustc hello.rs
error[E0384]: cannot assign twice to immutable variable `mutable`
--> hello.rs:4:2
|
3 | let mutable:i32 = 12;
| ------- first assignment to `mutable`
4 | mutable = 21; // 合法,修改值
| ^^^^^^^^^^^^ cannot assign twice to immutable variable
|
help: consider making this binding mutable
|
3 | let mut mutable:i32 = 12;
| +++
warning: variable `mutable` is assigned to, but never used
--> hello.rs:3:6
|
3 | let mutable:i32 = 12;
| ^^^^^^^
|
= note: consider using `_mutable` instead
= note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default
warning: value assigned to `mutable` is never read
--> hello.rs:4:2
|
4 | mutable = 21; // 合法,修改值
| ^^^^^^^^^^^^
|
= help: maybe it is overwritten before being read?
= note: `#[warn(unused_assignments)]` (part of `#[warn(unused)]`) on by default
error: aborting due to 1 previous error; 2 warnings emitted
For more information about this error, try `rustc --explain E0384`.Code language: JavaScript (javascript)
3 变量遮蔽(Shadowing)
重复使用 let 定义同名变量,会遮蔽旧变量,二者是相互独立的变量,类型可以不同。
fn main() {
let mutable = 12;
let mutable = true; // 遮蔽上方的 i32 变量,新变量类型为 bool
}Code language: JavaScript (javascript)
复合类型:数组 & 元组
1. 数组
- 语法格式:
[元素类型; 长度],类型、长度固定,所有元素类型必须一致。
let my_array: [i32; 5] = [1, 2, 3, 4, 5];Code language: JavaScript (javascript)
2. 元组
- 使用
()包裹,可存放多个不同类型的值。
let my_tuple = (5u32, 1u8, true, -5.04f32);Code language: JavaScript (javascript)