Hello, World!

你的第一个 Rust 程序

按照程序员世界的传统,学习一门新语言的第一件事,就是让计算机说出 “Hello, world!”。这不只是仪式感——它能让你快速感受到这门语言最基本的节奏:写代码、编译、运行。

创建项目目录

Rust 对代码存放的位置没有任何限制,但养成规范的目录结构是好习惯。我们在主目录下创建一个统一的 projects 目录,存放本教程的所有练习。

Linux / macOS / Windows PowerShell:

mkdir ~/projects
cd ~/projects
mkdir hello_world
cd hello_world

Windows CMD:

mkdir "%USERPROFILE%\projects"
cd /d "%USERPROFILE%\projects"
mkdir hello_world
cd hello_world

文件命名约定: 如果文件名包含多个单词,用下划线分隔,例如 hello_world.rs,而不是 helloworld.rs。这是 Rust 社区的惯例。

编写第一个程序

hello_world 目录下,创建名为 main.rs 的文件(Rust 源文件以 .rs 结尾),输入以下内容:

fn main() {
    println!("Hello, world!");
}

保存文件。你刚才写完了人生中第一个 Rust 程序,只有两行代码。接下来我们逐行拆解它。

程序解剖:每行代码的含义

这个程序虽然简单,但 Rust 的几个核心语法已经悄悄出现了。

fn main() 是什么?

fnfunction(函数) 的缩写,main 是这个函数的名字,() 表示它不接收任何参数。

// main 函数是程序的入口点
// Rust 运行时总是从这里开始执行
fn main() {
    // 函数体放在一对大括号里
}

main 函数是每个可执行 Rust 程序的入口点——就像马拉松的起跑线,无论程序有多复杂,都从 main 跑起来。

Rust 规范要求左大括号 { 和函数声明放在同一行,中间加一个空格。如果你不确定格式是否规范,可以运行 rustfmt main.rs,这是 Rust 工具链内置的格式化工具,会自动帮你整理代码风格。

println! 是什么?

注意 println 后面有一个感叹号 !。在 Rust 中,! 的是宏(macro),不是普通函数

fn main() {
    println!("Hello, world!");  // println! 是宏
}

宏和函数有本质区别——宏在编译阶段就会展开处理代码,能做到函数做不到的事情(比如接受数量不固定的参数)。println! 就是一个功能强大的宏,能格式化并把文本打印到终端。

关于”宏到底是什么”先按下不表,等你对 Rust 有了更多了解之后,我们会专门深入讲解。现在只需记住一条规则:看到 ! = 调用的是宏。

字符串字面量与分号

fn main() {
    //        双引号包裹的文本叫字符串字面量
    println!("Hello, world!");
    //                        ^ 英文分号,表示这条语句结束
}

还有两个细节值得注意:

  1. 4 个空格的缩进,不是 Tab。这是 Rust 社区的统一约定。
  2. 英文分号 ; 表示这条语句已经完整结束。Rust 中大多数语句都以 ; 结尾——后续你会理解为什么”大多数”而不是”全部”。

编译并运行

Rust 是编译型语言,必须先把源代码编译成二进制可执行文件,才能运行。

第一步:编译

在终端中,确保你在 hello_world 目录下,执行:

rustc main.rs

这条命令调用 Rust 编译器 rustc,把 main.rs 编译成可执行文件。编译成功后不会有任何输出——没有消息就是好消息

第二步:查看生成的文件

ls          # Linux / macOS
dir /B      # Windows CMD

你会看到:

文件说明
main.rs你写的源代码
main(Linux/macOS)或 main.exe(Windows)编译产出的可执行文件
main.pdb(仅 Windows)调试符号文件

第三步:运行

./main          # Linux / macOS
.\main.exe      # Windows PowerShell / CMD

终端应该输出:

Hello, world!

看到这行输出了吗?恭喜你,你已经是一名 Rust 开发者了!

编译型 vs 解释型:为什么 Rust 要编译?

如果你之前学过 Python、Ruby 或 JavaScript,可能会觉得”先编译再运行”多了一步,有点麻烦。但这背后有深刻的权衡。

特性解释型(Python / JS)编译型(Rust / C++)
运行方式需要解释器逐行执行直接运行二进制文件
分发程序对方需要安装对应运行时对方不需要安装任何东西
性能相对较慢接近硬件极限
错误发现时机运行时才暴露编译时就能发现大多数错误

Rust 选择做预编译(ahead-of-time compiled)语言,带来了两个关键好处:

分发简单:你可以把编译好的 main 文件直接发给任何人,他们不需要安装 Rust 就能直接运行。发给朋友一个 Python 脚本,他得先装 Python;发给他一个 Rust 编译出的可执行文件,双击就跑。

错误前置:Rust 编译器极其严格,能在你运行代码之前发现大量潜在错误。这也是 Rust”安全性”的核心来源之一——它不让不安全的程序通过编译关。

每次看到编译器报错,请别沮丧。Rust 的报错信息在所有主流语言里是出了名的详细和友好,它在帮你、不是在为难你。渐渐地你会发现,「把错误解决在编译阶段」是一件很爽的事。

小结

这篇文章里,你完成了人生中第一个 Rust 程序,并了解了它的每一行代码。回顾关键点:

  • 每个 Rust 可执行程序都从 fn main() 开始运行
  • println! 是一个,注意感叹号 !
  • rustc main.rs 编译源代码,生成可执行文件
  • Rust 是预编译语言,生成的二进制文件可以独立分发

rustc 直接编译对小程序没问题,但随着项目规模增长,管理依赖、组织代码文件会变得很繁琐。下一篇文章,我们来认识 Rust 的构建和包管理工具 Cargo,它才是你日常开发的真正起点。

练习题

程序入口

加载题目中…

宏的标志

加载题目中…

缩进风格

加载题目中…

编译命令

加载题目中…

预编译语言的优势

加载题目中…

错误修复

下面的代码有两处语法错误,找出并修复它们,让程序输出 Hello, world!

fn main() {
    println("Hello, world!")
}