基本类型

Rust 内置丰富的原生类型(Primitives),主要分为标量类型复合类型两大类。

(一) 标量类型(Scalar Types)

表示单一独立的值,包含 6 类:

  • 有符号整型i8i16i32i64i128isize(长度适配系统指针大小)
  • 无符号整型u8u16u32u64u128usize(长度适配系统指针大小)
  • 浮点型f32f64
  • 字符型 char:存储 Unicode 标量值(如 'a''α''∞'),每个字符占用 4 字节
  • 布尔型 bool:仅两个取值 truefalse
  • 单元类型 ():唯一值为空元组 ()。虽形式是元组,但因仅含单个值,不属于复合类型。

(二) 复合类型(Compound Types)(末尾会学习)

由多个值组合而成:

  1. 数组:示例 [1, 2, 3]
  2. 元组:示例 (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)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注