RUST-基础与变量

第一章:基础入门与环境配置

🔧 核心概念:Cargo

Cargo 是 Rust 的构建系统和包管理器(类似 npm/pip)。

  • 常用命令
    • cargo new project_name:创建新项目
    • cargo build:编译项目
    • cargo run:编译并运行(日常开发最常用)
    • cargo check:快速检查语法错误(不生成二进制文件,速度快)

📁 项目结构

Plaintext

1
2
3
4
5
6
7
hello_cargo/
├── Cargo.toml # 项目配置文件(依赖、元数据)
├── src/
│ └── main.rs # 源代码入口
└── target/ # 构建输出目录(自动生成)
└── debug/
└── hello_cargo # 编译后的可执行文件

💻 VS Code 远程开发 (Remote-SSH) 🔥

推荐方案:直接在云服务器上开发。

  1. 扩展:安装 Remote - SSH
  2. 连接Ctrl+Shift+P -> Remote-SSH: Connect to Host... -> ssh user@ip
  3. 插件:在远程环境中安装 rust-analyzer 扩展。
  • 优点:环境一致,编译运行都在服务器,不占用本地资源。

第二章:变量与输入输出 (猜数字游戏)

🔣 变量声明与不可变性

Rust 设计理念:安全优先

  • let x = 5; —— 不可变(Immutable),绑定后不能修改。
  • let mut x = 5; —— 可变(Mutable),显式声明后可修改。

⌨️ 接收用户输入

Rust

1
2
3
4
5
6
use std::io;

let mut guess = String::new();
io::stdin()
.read_line(&mut guess)
.expect("Failed to read line");
  • &mut guess 详解
    • &:引用(Reference),允许程序多次访问同一数据而无需拷贝。
    • mut:可变。read_line 需要修改字符串内容,必须传入可变引用。
  • .expect() 处理结果
    • read_line 返回 Result 类型(OkErr)。
    • .expect() 会在 Err 时引发程序崩溃(Panic)并打印信息。

📤 格式化打印

Rust 1.58+ 支持命名参数:

Rust

1
2
3
let x = 5;
let y = 10;
println!("x = {x} and y + 2 = {}", y + 2); // 混合使用:变量名与占位符

第三章:数据类型与格式化

一、 标量类型 (Scalar Types)

位数 有符号 (i) 无符号 (u) 范围说明
8-bit i8 u8 $0$ 到 $255$ (u8)
32-bit i32 u32 默认类型,性能最优
arch isize usize 依赖机器架构,常用于数组索引
  • 浮点型f32f64(默认,精度高)。
  • **字符型 (char)**:占用 4 字节,支持 Unicode(Emoji、中文)。

二、 复合类型 (Compound Types)

  1. **元组 (Tuple)**:长度固定,类型可不同。
    • 访问:tup.0let (x, y) = tup;
  2. 数组 (Array):长度固定,类型必须相同,分配在栈上。
    • 定义:let a: [i32; 5] = [1, 2, 3, 4, 5];
    • 快捷初始化:let b = [3; 5]; // [3, 3, 3, 3, 3]

三、 核心避坑指南 ⚠️

  • 引号使用'a' 是字符 (char),"abc" 是字符串 (&str)。
  • 进阶打印占位符
    • {:x}:十六进制
    • {:b}:二进制
    • {:?}:Debug 打印(用于打印元组、数组等复杂类型)
  • 未使用变量:在变量名前加下划线(如 let _x = 5;)可消除警告。

第四章:变量进阶、常量与断言

一、 断言 (Assertions)

用于检查逻辑,失败时会触发 Panic

用途 示例
assert_eq!(a, b) 断言相等 assert_eq!(2, 1 + 1);
assert_ne!(a, b) 断言不等 assert_ne!(5, 10);
assert!(cond) 断言为真 assert!(x > 0);

二、 常量 (Constants)

  • 语法const MAX_POINTS: u32 = 100_000;
  • 特性
    1. 必须使用 const
    2. 必须显式标注类型
    3. 全局有效,永远不可变(不可加 mut)。
    4. 命名约定:SCREAMING_SNAKE_CASE

三、 变量遮蔽 (Shadowing)

允许声明同名新变量来覆盖旧变量。

Rust

1
2
3
let x = 5;
let x = x + 1; // 遮蔽旧 x
let x = "Space"; // 遮蔽并改变类型
  • mut 的区别:遮蔽通过 let 重新创建新变量,因此可以 改变类型mut 只能修改原值,类型必须保持一致。

四、 变量绑定基础

  • 解构绑定let (a, mut b) = (1, 2); —— a 不可变,b 可变。

💡 学习心得总结

  1. 安全为王:默认不可变、强制错误处理 (Result) 是 Rust 的灵魂。
  2. 引用借用& 借用和 &mut 可变借用解决了数据竞争问题。
  3. 开发工具:Cargo 的集成度极高,极大提升了工程效率。

📖 变量绑定与解构 - Rust By Practice

📚 Rust 语言圣经 - 变量