第3章 - Hello World
嗨,朋友!我是长安。
上一章我们把开发环境搭建好了,现在终于可以写代码了!按照编程界的传统,我们的第一个程序当然是 "Hello, World!"。
别小看这个简单的程序,它会帮你理解 Rust 项目的基本结构。
🚀 创建第一个项目
打开终端,输入以下命令:
cargo new hello_world
cd hello_world
让我们看看 Cargo 为我们创建了什么:
hello_world/
├── Cargo.toml # 项目配置文件
├── .gitignore # Git 忽略文件
└── src/
└── main.rs # 主程序文件
长安说
cargo new 命令会自动帮你创建一个完整的 Rust 项目结构,甚至还初始化了 Git 仓库!是不是很贴心?
📝 理解 Cargo.toml
打开 Cargo.toml 文件,你会看到:
[package]
name = "hello_world"
version = "0.1.0"
edition = "2021"
[dependencies]
让我解释一下每一部分:
| 字段 | 说明 |
|---|---|
name | 项目名称 |
version | 项目版本号 |
edition | Rust 版本(2021 是最新的稳定版) |
dependencies | 项目依赖(目前是空的,后面会用到) |
什么是 Edition?
Rust 每隔几年会发布一个新的 Edition(版次),引入一些向后兼容的改进。目前最新的是 2021 Edition。你不需要担心这个,使用最新版本就好。
📖 理解 main.rs
打开 src/main.rs 文件,你会看到:
fn main() {
println!("Hello, world!");
}
就这么简单!让我们逐行解读:
第1行:fn main() {
fn main() {
fn是 function(函数)的缩写,用来定义函数main是函数名,这是一个特殊的函数,是程序的入口()表示这个函数不接收任何参数{表示函数体的开始
长安说
main 函数就像是你家的大门,程序运行时会从这里开始执行。每个可执行的 Rust 程序都必须有一个 main 函数。
第2行:println!("Hello, world!");
println!("Hello, world!");
println!是一个宏(macro),用来打印文本到控制台- 注意后面有个
!,这表示它是宏,不是普通函数 "Hello, world!"是要打印的字符串;是语句结束符,Rust 的每条语句都要以分号结尾
注意
println! 后面有个感叹号 !,一定不要忘记!有感叹号表示这是一个宏,没有感叹号的话编译器会报错。
第3行:}
}
这个大括号表示 main 函数的结束。
🏃 运行程序
在项目目录下,运行:
cargo run
你会看到:
Compiling hello_world v0.1.0 (/path/to/hello_world)
Finished dev [unoptimized + debuginfo] target(s) in 1.23s
Running `target/debug/hello_world`
Hello, world!
让我们理解一下这个输出:
- Compiling...: Cargo 正在编译你的代码
- Finished...: 编译完成,生成了可执行文件
- Running...: Cargo 运行你的程序
- Hello, world!: 这是你的程序输出的内容
长安说
第一次运行可能需要几秒钟,因为 Rust 需要编译整个项目。之后如果代码没变,运行会快很多。
🔍 理解编译过程
Rust 是一门编译型语言,这意味着:
- 编写代码:你写的是
.rs源文件 - 编译:Rust 编译器将源代码转换成机器码(可执行文件)
- 运行:直接运行生成的可执行文件
这和 Python、JavaScript 等解释型语言不同,后者是边运行边解释代码。
编译型语言的优点:
- ✅ 运行速度快
- ✅ 编译时就能发现很多错误
- ✅ 生成的可执行文件可以独立运行,不需要安装 Rust
缺点:
- ❌ 编译需要时间(但 Rust 的编译速度还不错)
🛠️ Cargo 的其他命令
只编译,不运行
cargo build
这会在 target/debug/ 目录下生成可执行文件,但不会运行它。
检查代码
cargo check
这个命令只检查代码能否编译,但不生成可执行文件,速度比 cargo build 快得多。写代码时可以经常用这个命令检查有没有错误。
编译优化版本
cargo build --release
这会生成优化后的版本,运行速度更快,但编译时间更长。生成的文件在 target/release/ 目录下。
长安说
开发时用 cargo run(默认是 debug 模式),发布时用 cargo build --release。
🎨 修改 Hello World
让我们试着修改一下程序,打印一些不同的内容。
打开 src/main.rs,修改成:
fn main() {
println!("你好,世界!");
println!("我叫长安");
println!("这是我的第一个 Rust 程序!");
}
保存文件,然后运行:
cargo run
输出:
你好,世界!
我叫长安
这是我的第一个 Rust 程序!
长安说
println! 可以打印任何文本,包括中文、emoji 等。Rust 对 Unicode 的支持非常好!
📐 格式化输出
println! 还可以打印变量的值。试试这个:
fn main() {
println!("我的名字是 {}", "长安");
println!("我今年 {} 岁", 25);
println!("我喜欢 {} 和 {}", "编程", "旅行");
}
运行后看到:
我的名字是 长安
我今年 25 岁
我喜欢 编程 和 旅行
{} 是一个占位符,会被后面的值替换。
注意
占位符的数量必须和后面提供的值的数量一致,否则会编译错误。
💡 常见错误和解决方法
错误1:忘记感叹号
fn main() {
println("Hello, world!"); // ❌ 错误!
}
错误信息:
error: expected `;`, found `(`
解决方法:改成 println!(加感叹号)
错误2:忘记分号
fn main() {
println!("Hello, world!") // ❌ 错误!缺少分号
}
错误信息:
error: expected `;`
解决方法:在行尾加上分号 ;
错误3:双引号不匹配
fn main() {
println!("Hello, world!); // ❌ 错误!缺少右引号
}
错误信息:
error: unterminated string literal
解决方法:确保字符串两边都有双引号
长安说
Rust 的编译器错误提示非常友好,它会明确告诉你哪里错了、为什么错了,甚至怎么改。遇到错误不要慌,仔细看错误信息!
💡 小结
在这一章,我们学会了:
- 使用
cargo new创建新项目 - 理解 Rust 项目的基本结构(
Cargo.toml和src/main.rs) main函数是程序的入口- 使用
println!宏打印输出 - 使用
cargo run编译并运行程序 - 理解编译型语言的工作方式
- 使用占位符
{}格式化输出
🚀 下一步
现在你已经会写简单的 Rust 程序了!但要写更复杂的程序,我们需要学习变量。
下一章,我们会学习如何在 Rust 中定义和使用变量,以及 Rust 独特的"不可变性"概念。
💪 练习题
动手试试这些练习:
- 创建一个新项目
my_info,打印你的姓名、年龄和爱好 - 使用占位符
{}打印一句话:"我叫{名字},我{年龄}岁了" - 打印一个包含 emoji 的句子,比如 "我爱编程 💻"
- 试着故意写一个错误的代码(比如忘记分号),看看编译器的错误提示
答案示例
// 练习1 和 2
fn main() {
println!("我叫 {}", "长安");
println!("我 {} 岁了", 25);
println!("我喜欢:");
println!(" - 编程");
println!(" - 旅行");
println!(" - 阅读");
// 练习3
println!("我爱编程 💻");
println!("今天天气真好 ☀️");
}
