你好,世界!

既然您已经安装了 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!");
}

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

首先,Rust 样式是用四个空格缩进,而不是制表符。

其次,println! 调用了一个 Rust 宏。 如果它调用的是函数,则应输入为 println(不带 !)。 我们将在第 19 章更详细地讨论 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 程序。