你好,世界!

既然你已经安装了 Rust,现在是时候编写你的第一个 Rust 程序了。按照学习一门新语言的传统,我们会编写一个将文本 Hello, world! 打印到屏幕的小程序,所以我们在这里也会这样做!

注意:本书假设你对命令行有基本的了解。Rust 对你的编辑或工具或代码存放位置没有具体要求,因此,如果你喜欢使用集成开发环境(IDE)而不是命令行,请随意使用你喜欢的 IDE。许多 IDE 现在都有一定程度的 Rust 支持;有关详细信息,请查看 IDE 的文档。Rust 团队一直专注于通过 rust-analyzer 实现出色的 IDE 支持。请参阅附录 D了解更多详情。

创建项目目录

你将首先创建一个目录来存储你的 Rust 代码。代码存放在哪里对 Rust 来说并不重要,但对于本书中的练习和项目,我们建议在你的主目录中创建一个 projects 目录,并将你所有的项目都放在那里。

打开终端并输入以下命令以创建 projects 目录和 projects 目录中 “Hello, world!” 项目的目录。

对于 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

编写和运行 Rust 程序

接下来,创建一个新的源文件并将其命名为 main.rs。Rust 文件的扩展名始终为 .rs。如果你的文件名中使用多个单词,则约定是用下划线分隔它们。例如,使用 hello_world.rs 而不是 helloworld.rs

现在打开你刚刚创建的 main.rs 文件,并输入列表 1-1 中的代码。

文件名:main.rs
fn main() { println!("Hello, world!"); }
列表 1-1:一个打印 Hello, world! 的程序

保存文件并返回到 ~/projects/hello_world 目录中的终端窗口。在 Linux 或 macOS 上,输入以下命令来编译和运行文件

$ rustc main.rs $ ./main Hello, world!

在 Windows 上,输入命令 .\main.exe 而不是 ./main

> rustc main.rs > .\main.exe Hello, world!

无论你的操作系统是什么,字符串 Hello, world! 都应该打印到终端。如果你没有看到此输出,请返回到“故障排除”安装部分的帮助方法。

如果 Hello, world! 确实打印出来了,祝贺你!你已经正式编写了一个 Rust 程序。这使你成为一名 Rust 程序员——欢迎!

Rust 程序剖析

让我们详细回顾一下这个 “Hello, world!” 程序。这是谜题的第一部分

fn main() { }

这些行定义了一个名为 main 的函数。main 函数很特殊:它始终是每个可执行 Rust 程序中第一个运行的代码。在这里,第一行声明了一个名为 main 的函数,该函数没有参数且不返回任何内容。如果存在参数,它们将放在括号 () 内。

函数体用 {} 包裹。Rust 要求所有函数体都用花括号括起来。良好的风格是将左花括号与函数声明放在同一行,并在两者之间添加一个空格。

注意:如果你想在 Rust 项目中坚持标准风格,你可以使用一个名为 rustfmt 的自动格式化工具来以特定风格格式化你的代码(有关 rustfmt 的更多信息,请参阅附录 D)。Rust 团队已将此工具与标准 Rust 发行版一起包含在内,就像 rustc 一样,因此它应该已经安装在你的计算机上!

main 函数的主体包含以下代码

#![allow(unused)] fn main() { println!("Hello, world!"); }

这行代码完成了这个小程序中的所有工作:它将文本打印到屏幕上。这里有四个重要的细节需要注意。

首先,println! 调用了一个 Rust 宏。如果它调用的是函数,则它将被输入为 println(不带 !)。我们将在第 20 章中更详细地讨论 Rust 宏。现在,你只需要知道使用 ! 意味着你正在调用宏而不是普通函数,并且宏并不总是遵循与函数相同的规则。

其次,你看到了 "Hello, world!" 字符串。我们将此字符串作为参数传递给 println!,并且该字符串将打印到屏幕上。

第三,我们用分号 (;) 结束该行,这表示此表达式已结束,下一个表达式已准备好开始。大多数 Rust 代码行都以分号结尾。

编译和运行是独立的步骤

你刚刚运行了一个新创建的程序,所以让我们检查一下过程中的每个步骤。

在运行 Rust 程序之前,你必须使用 Rust 编译器编译它,方法是输入 rustc 命令并将你的源文件名传递给它,如下所示

$ rustc main.rs

如果你有 C 或 C++ 背景,你会注意到这类似于 gccclang。成功编译后,Rust 会输出一个二进制可执行文件。

在 Linux、macOS 和 Windows 上的 PowerShell 上,你可以通过在 shell 中输入 ls 命令来查看可执行文件

$ ls main main.rs

在 Linux 和 macOS 上,你将看到两个文件。在 Windows 上的 PowerShell 中,你将看到与使用 CMD 时相同的三个文件。在 Windows 上的 CMD 中,你将输入以下内容

> dir /B %= the /B option says to only show the file names =% main.exe main.pdb main.rs

这显示了带有 .rs 扩展名的源代码文件、可执行文件(Windows 上为 main.exe,但在所有其他平台上为 main)以及使用 Windows 时,包含调试信息的 .pdb 扩展名的文件。从这里,你运行 mainmain.exe 文件,如下所示

$ ./main # or .\main.exe on Windows

如果你的 main.rs 是你的 “Hello, world!” 程序,则此行会将 Hello, world! 打印到你的终端。

如果你更熟悉动态语言(例如 Ruby、Python 或 JavaScript),你可能不习惯将编译和运行程序作为单独的步骤。Rust 是一种提前编译语言,这意味着你可以编译一个程序并将可执行文件提供给其他人,即使他们没有安装 Rust 也可以运行它。如果你给某人一个 .rb.py.js 文件,他们需要安装 Ruby、Python 或 JavaScript 实现(分别)。但在这些语言中,你只需要一个命令即可编译和运行你的程序。一切都是语言设计中的权衡。

仅使用 rustc 进行编译对于简单的程序来说是可以的,但是随着你的项目增长,你将需要管理所有选项并使其易于共享你的代码。接下来,我们将向你介绍 Cargo 工具,这将帮助你编写真实的 Rust 程序。