你好,世界!

现在你已经安装了 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中的代码。

Filename: main.rs
fn main() {
    println!("Hello, world!");
}
Listing 1-1: A program that prints 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(没有 !)。我们将在第 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 扩展名的源代码文件,可执行文件 (main.exe 在 Windows 上,但在所有其他平台上为 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程序。