你好,世界!
既然你已经安装了 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 中的代码。
fn main() { println!("Hello, world!"); }
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++ 背景,你会注意到这类似于 gcc 或 clang。编译成功后,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 扩展名文件。然后,你运行 main 或 main.exe 文件,如下所示
$ ./main # or .\main.exe on Windows
如果你的 main.rs 是你的 “Hello, world!” 程序,这一行就会在你的终端上打印 Hello, world!。
如果你更熟悉动态语言,比如 Ruby、Python 或 JavaScript,你可能不习惯将程序的编译和运行作为单独的步骤。Rust 是一种 提前编译 (ahead-of-time compiled) 语言,这意味着你可以编译一个程序,并将可执行文件提供给其他人,他们甚至无需安装 Rust 就能运行它。如果你给别人一个 .rb、.py 或 .js 文件,他们需要分别安装 Ruby、Python 或 JavaScript 解释器。但在这些语言中,你只需要一个命令来编译并运行你的程序。语言设计中的一切都是取舍。
对于简单的程序,只使用 rustc 进行编译是可以的,但随着项目变大,你会希望管理所有选项并方便地共享代码。接下来,我们将向你介绍 Cargo 工具,它能帮助你编写实际的 Rust 程序。