第一章:项目初始化与 Rust 基础语法
教学目标
- 掌握 Cargo 工具的基本使用
- 理解 Rust 基础语法与项目结构
- 完成项目初始化与 Hello World 程序
核心知识点
1. Rust 开发环境搭建
Cargo 包管理工具介绍
Rust 的包管理工具 Cargo,不仅负责构建项目,还能管理项目依赖和运行测试。它类似于 Python 的 pip、Node.js 的 npm,是 Rust 开发中不可或缺的工具。Cargo 会自动为我们处理编译过程,并生成标准化的项目结构,大大提高开发效率。
在开始使用 Cargo 之前,需要先安装 Rust 开发环境。最简便的方式是通过 Rust 官方提供的安装脚本rustup进行安装:
# 在Linux/macOS系统中执行
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# 在Windows系统中,下载并运行rustup-init.exe
安装完成后,打开终端输入rustc --version和cargo --version,如果能显示出版本信息,说明 Rust 和 Cargo 已成功安装。
cargo new与项目目录结构解析
Cargo 提供了cargo new命令用于创建新的 Rust 项目。下面我们通过该命令创建一个名为rusttask的项目:
# 在终端中执行,创建一个名为rusttask的新项目
cargo new rusttask --bin
# 进入项目目录
cd rusttask
上述命令中,--bin参数表示创建一个可执行程序(默认为库项目)。执行完成后,会生成如下项目结构:
rusttask/
├── Cargo.toml
└── src
└── main.rs
-
Cargo.toml:项目配置文件,包含项目元数据(名称、版本、作者等)和依赖声明。
-
src/ main.rs:主源代码文件,Rust 程序的入口点。
2. 基础语法入门
变量绑定(let)与不可变性
在 Rust 中,使用let关键字声明变量,默认情况下变量是不可变的,这是 Rust 保证内存安全的重要机制之一。不可变性意味着一旦变量被绑定值后,就不能再修改其值,这有助于避免多线程环境下的竞态条件等问题。
// 声明不可变变量a并绑定值10
let a = 10;
// 尝试修改a的值会报错
// a = 20; // 错误:cannot assign twice to immutable variable `a`
// 使用mut关键字声明可变变量b
let mut b = 20;
// 可以多次修改可变变量的值
b = 30;
b = 40;
原生数据类型
Rust 是一种静态类型语言,所有变量的类型在编译时就已经确定。Rust 提供了丰富的原生数据类型,主要包括:
- 整数类型:根据长度和有无符号分为i8、i16、i32、i64、i128(有符号)和u8、u16、u32、u64、u128(无符号),默认整数类型为i32。
- 浮点数类型:f32(单精度)和f64(双精度),默认浮点数类型为f64。
- 布尔类型:bool,值为true或false。
- 字符类型:char,表示单个 Unicode 字符,用单引号包裹。
- 字符串类型:String(可增长的动态字符串)和&str(字符串切片,不可变)。
let integer: i32 = 100; // 有符号32位整数
let unsigned: u64 = 1000000; // 无符号64位整数
let float: f64 = 3.14159; // 双精度浮点数
let boolean: bool = true; // 布尔值
let character: char = 'R'; // 字符
let string: String = "Rust".to_string(); // 动态字符串
let str_slice: &str = "Hello"; // 字符串切片
表达式与语句的区别
在 Rust 中,语句和表达式是两个不同的概念:
- 语句:执行某些操作但不返回值的代码行,以分号结尾。例如变量声明、函数调用等。
- 表达式:计算并产生一个值的代码片段,通常不使用分号结尾(若使用分号则会变成语句,丢弃返回值)。例如数学运算、函数调用(如果函数有返回值)等。
// 语句示例
let x = 5; // 变量声明语句
println!("Hello"); // 函数调用语句
// 表达式示例
let y = {
let a = 3;
let b = 4;
a + b // 表达式,返回a + b的值
}; // y的值为7
// 以下代码会报错,因为表达式后面加了分号变成了语句,没有返回值
// let z = { 1 + 2; }; // 错误:block cannot be used as an expression because it returns ()
println!宏的使用
println!是 Rust 中常用的宏,用于向标准输出打印文本。它支持格式化输出,使用类似 C 语言printf的格式字符串语法。
let name = "Rust";
let version = 1.0;
// 基本打印
println!("Hello, world!");
// 格式化打印,使用{}作为占位符
println!("Hello, {}!", name);
// 多个占位符,按顺序对应
println!("{} is version {}.", name, version);
// 可以为占位符指定名称
println!("{language} is version {ver}.", language = name, ver = version);
// 打印换行符
println!();
3. 项目实战
创建 RustTask 项目
现在我们正式开始创建 RustTask 项目。打开终端,进入你想要存放项目的目录,执行以下命令:
# 创建RustTask项目
cargo new rusttask --bin
# 进入项目目录
cd rusttask
编写基础入口函数并输出欢迎信息
创建项目后,Cargo 已经为我们生成了一个简单的 Hello World 程序。我们需要修改src/main.rs文件,使其输出 RustTask 项目的欢迎信息。
打开src/main.rs文件,默认内容如下:
fn main() {
println!("Hello, world!");
}
将其修改为:
fn main() {
println!("===== RustTask 命令行任务管理系统 =====");
println!("欢迎使用RustTask,这是一个基于Rust开发的命令行任务管理工具。");
println!("通过本项目,你将学习Rust编程的核心语法与工程实践能力。");
}
编译并运行程序
修改完成后,使用 Cargo 编译并运行程序:
# 编译项目
cargo build
# 运行程序
cargo run
如果一切顺利,终端将输出我们编写的欢迎信息:
===== RustTask 命令行任务管理系统 =====
欢迎使用RustTask,这是一个基于Rust开发的命令行任务管理工具。
通过本项目,你将学习Rust编程的核心语法与工程实践能力。
实践作业
实现一个简单的命令行程序,输出个人信息并计算简单数学表达式。具体要求:
- 声明变量存储你的姓名、年龄等个人信息,并输出到终端。
- 声明两个整数变量,计算它们的和、差、积、商,并输出结果。
- 声明一个浮点数变量,计算其平方和平方根(提示:使用std::f64::sqrt函数),并输出结果。
fn main() {
// 在此处编写代码
}
通过完成这个作业,你可以进一步巩固本章学习的变量声明、数据类型、表达式和println!宏等知识点。