Hello, World!
现在你已经安装好 Rust,是时候编写第一个 Rust 程序了。学习新语言时,通常会先编写一个向屏幕打印 Hello, world! 的小程序,我们也照例从这里开始!
注意:本书假设你基本熟悉命令行。Rust 对你使用的编辑器、工具或代码存放位置没有特别要求;如果你更喜欢使用 IDE 而不是命令行,尽管使用自己喜欢的 IDE。如今许多 IDE 都在不同程度上支持 Rust,详情请查阅相应 IDE 的文档。Rust 团队一直致力于通过 rust-analyzer 提供出色的 IDE 支持。更多详情请参阅附录 D。
设置项目目录
首先创建一个目录来存放 Rust 代码。Rust 不在意代码存放在哪里,但为了完成本书中的练习和项目,我们建议在主目录下创建一个 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,而不是 ./main:
> rustc main.rs
> .\main
Hello, world!
无论使用哪种操作系统,终端都应该打印字符串 Hello, world!。如果没有看到该输出,请回到安装部分的“故障排除”小节查看如何获取帮助。
如果成功打印了 Hello, world!,恭喜你!你已经正式编写了一个 Rust 程序。现在你就是一名 Rust 程序员了,欢迎加入!
Rust 程序剖析
让我们详细回顾这个“Hello, world!”程序。先来看第一部分:
fn main() {
}
这些代码定义了一个名为 main 的函数。main 函数很特殊:它总是每个可执行 Rust 程序最先运行的代码。这里,第一行声明了一个名为 main、没有参数且不返回值的函数。如果有参数,它们会写在圆括号(())中。
函数体由 {} 包围。Rust 要求所有函数体都使用花括号。良好的代码风格是将左花括号放在函数声明所在行,并在两者之间留一个空格。
注意:如果你希望 Rust 项目都遵循统一的代码风格,可以使用名为 rustfmt 的自动格式化工具来格式化代码(关于 rustfmt 的更多信息,请参阅附录 D)。Rust 团队将此工具与 rustc 一样,随 Rust 标准发行版一并提供,因此它应该已经安装在你的计算机上了!
main 函数体中包含以下代码:
#![allow(unused)]
fn main() {
println!("Hello, world!");
}
这一行完成了这个小程序的全部工作:向屏幕打印文本。这里有三个值得注意的细节。
第一,println! 调用了一个 Rust 宏。如果调用的是函数,写法会是 println(不带 !)。Rust 宏可以生成代码,以扩展 Rust 语法;我们会在第 20 章中详细讨论。现在你只需知道,使用 ! 表示调用的是宏而不是普通函数,而且宏并不总是遵循与函数相同的规则。
第二,你看到了字符串 "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 on Windows
如果 main.rs 是你的“Hello, world!”程序,这条命令就会在终端打印 Hello, world!。
如果你更熟悉 Ruby、Python 或 JavaScript 等动态语言,可能不习惯将编译和运行程序分成两个步骤。Rust 是一种提前编译语言,也就是说,你可以编译程序并将可执行文件交给别人;即使对方没有安装 Rust,也能运行它。如果你把 .rb、.py 或 .js 文件交给别人,对方就必须分别安装 Ruby、Python 或 JavaScript 实现。但使用这些语言时,只需一条命令就能编译并运行程序。语言设计中的一切都是取舍。
对于简单程序,直接使用 rustc 编译完全没问题;但随着项目变大,你会希望管理各种选项,并让代码更容易分享。接下来我们将介绍 Cargo 工具,它能帮助你编写真实项目中的 Rust 程序。