【Rust】02-变量、不可变性与基础类型

变量、不可变性与基础类型

学习目标

  • 理解 Rust 默认不可变的设计。
  • 掌握常见标量类型和复合类型。
  • 区分变量遮蔽和可变变量。

默认不可变

Rust 中变量默认不可变:

rust 复制代码
fn main() {
    let x = 5;
    println!("{x}");
    // x = 6; // 编译错误
}

如果需要修改变量,必须显式写 mut

rust 复制代码
fn main() {
    let mut x = 5;
    x = 6;
    println!("{x}");
}

默认不可变让代码更容易推理。看到一个没有 mut 的变量,就知道它绑定之后不会被重新赋值。

变量遮蔽

Rust 允许用同名变量遮蔽前一个变量:

rust 复制代码
fn main() {
    let spaces = "   ";
    let spaces = spaces.len();

    println!("{spaces}");
}

这不是修改原变量,而是创建了一个新的绑定。遮蔽可以改变类型,mut 不能改变变量类型。

rust 复制代码
fn main() {
    let mut value = "42";
    // value = 42; // 编译错误:类型不一致
}

标量类型

Rust 常见标量类型包括:

  • 整数:i32u32i64usize 等。
  • 浮点数:f32f64
  • 布尔值:bool
  • 字符:char

示例:

rust 复制代码
fn main() {
    let count: u32 = 10;
    let price: f64 = 19.9;
    let enabled: bool = true;
    let letter: char = 'R';

    println!("{count}, {price}, {enabled}, {letter}");
}

char 表示 Unicode 标量值,不只是 ASCII 字符,所以一个 char 可能占用多个字节。

整数类型选择

初学时可以遵循简单规则:

  • 普通数字优先使用 i32
  • 数组索引、集合长度使用 usize
  • 明确需要非负并且有接口约束时使用 u32u64 等。

不要为了"看起来更节省空间"过早选择很小的整数类型,例如 u8i8。除非你正在处理二进制协议、图像数据、嵌入式内存等场景。

元组

元组可以组合不同类型的值:

rust 复制代码
fn main() {
    let user = ("Alice", 18, true);
    let name = user.0;
    let age = user.1;

    println!("{name} is {age}");
}

也可以解构:

rust 复制代码
fn main() {
    let point = (3, 5);
    let (x, y) = point;

    println!("x={x}, y={y}");
}

数组

数组长度固定,且所有元素类型相同:

rust 复制代码
fn main() {
    let scores = [90, 85, 100];
    println!("{}", scores[0]);
}

数组类型可以写成 [类型; 长度]

rust 复制代码
let scores: [i32; 3] = [90, 85, 100];
let zeros = [0; 5]; // [0, 0, 0, 0, 0]

如果需要动态增长的列表,通常使用 Vec<T>,后续集合文章会介绍。

常量

常量使用 const,必须标注类型:

rust 复制代码
const MAX_POINTS: u32 = 100_000;

常量和不可变变量不同:常量在整个程序生命周期内有效,不能使用运行时计算结果初始化。

常见误区

  • let 默认不可变,不等于值永远不能变化;可以用遮蔽创建新绑定。
  • mut 只允许重新赋值,不允许改变变量类型。
  • 数组长度固定;动态列表应使用 Vec<T>
  • 字符串字面量不是 String,而是 &str

练习

  1. 写一个程序,定义姓名、年龄、是否正在学习 Rust,并打印出来。
  2. 用变量遮蔽把字符串 "2026" 转成数字 2026
  3. 创建一个长度为 5 的整数数组,打印第一个和最后一个元素。

后记

2026年6月10日17点02分于上海。

相关推荐
阳光是sunny14 小时前
别再被 worktree 绕晕了!AI 编程时代你必须掌握的 Git 隔离神器
前端·人工智能·后端
万少15 小时前
万少的博客 - 技术分享与解决方案
前端·javascript·后端
咖啡八杯15 小时前
GoF设计模式——备忘录模式
java·后端·spring·设计模式
苍何16 小时前
腾讯再放大招,企微 Agent 大圆开启内测
后端
ethantan16 小时前
一篇讲解AI Agent 组成:像人一样思考的智能体
人工智能·后端·程序员
Cosolar18 小时前
vLLM 生产级部署完全指南
人工智能·后端·架构
IT_陈寒18 小时前
垃圾回收器选错了,我的Java服务内存炸了
前端·人工智能·后端
用户83562907805119 小时前
使用 Python 在 PDF 中创建与管理书签
后端·python
Nturmoils19 小时前
字段太多看不全,ksql 的展开模式和输出控制怎么用
数据库·后端
大志说编程19 小时前
Agent面试真题06: 十分钟带你快速掌握Agent记忆管理高频面试题(附详细答案)
后端·面试·ai编程