第一章:项目初始化与 Rust 基础语法

66 阅读6分钟

第一章:项目初始化与 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 提供了丰富的原生数据类型,主要包括:

  1. 整数类型:根据长度和有无符号分为i8、i16、i32、i64、i128(有符号)和u8、u16、u32、u64、u128(无符号),默认整数类型为i32。
  1. 浮点数类型:f32(单精度)和f64(双精度),默认浮点数类型为f64。
  1. 布尔类型:bool,值为true或false。
  1. 字符类型:char,表示单个 Unicode 字符,用单引号包裹。
  1. 字符串类型: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编程的核心语法与工程实践能力。

实践作业

实现一个简单的命令行程序,输出个人信息并计算简单数学表达式。具体要求:

  1. 声明变量存储你的姓名、年龄等个人信息,并输出到终端。
  1. 声明两个整数变量,计算它们的和、差、积、商,并输出结果。
  1. 声明一个浮点数变量,计算其平方和平方根(提示:使用std::f64::sqrt函数),并输出结果。
fn main() {
    // 在此处编写代码
}

通过完成这个作业,你可以进一步巩固本章学习的变量声明、数据类型、表达式和println!宏等知识点。