Rust 学习笔记(二)Hello World

翻译自:https://doc.rust-lang.org/book/ch01-02-hello-world.html

现在你已经安装了 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,输入以下命令:

1
2
3
4
$ mkdir ~/projects
$ cd ~/projects
$ mkdir hello_world
$ cd hello_world

对于 Windows 命令提示符,输入以下命令:

1
2
3
4
> 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

1
2
3
fn main() {
println!("Hello, world!");
}

清单 1-1:一个打印“Hello, world!”的程序

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

1
2
3
$ rustc main.rs
$ ./main
Hello, world!

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

1
2
3
> rustc main.rs
> .\main.exe
Hello, world!

无论你使用什么操作系统,终端都应该打印出字符串“Hello, world!”。如果你没有看到这个输出,请参考安装部分的“故障排除”部分以获取帮助。

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

Rust 程序的结构

让我们详细回顾一下这个“Hello, world!”程序。首先是这个片段:

1
2
3
fn main() {

}

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

函数体被 {} 包裹。Rust 要求所有函数体都用大括号括起来。在函数声明和大括号之间加一个空格并放在同一行是一种良好的风格。

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

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

1
2
println!("Hello, world!");

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

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

其次,你看到了 "Hello, world!" 字符串。我们将这个字符串作为参数传递给 println!,然后字符串被打印到屏幕上。

第三,我们在行尾加上了一个分号(;),这表明这个表达式已经结束,下一个表达式准备开始。大多数 Rust 代码行都以分号结尾。

编译和运行是分开的步骤

你刚刚运行了一个新创建的程序,让我们来仔细检查一下这个过程中的每一步。

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

1
$ rustc main.rs

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

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

1
2
$ ls
main main.rs

在 Linux 和 macOS 上,你会看到两个文件。在 Windows 上使用 PowerShell 时,你会看到与使用 CMD 时相同的三个文件。在 Windows 上使用 CMD 时,你会输入以下命令:

1
2
3
4
> dir /B %= /B 选项表示仅显示文件名 =%
main.exe
main.pdb
main.rs

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

1
$ ./main # 或在 Windows 上使用 .\main.exe

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

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

对于简单程序,仅使用 rustc 编译是完全可行的,但随着你的项目增长,你将希望管理所有选项并使代码共享变得更容易。接下来,我们将向你介绍 Cargo 工具,它将帮助你编写实际的 Rust 程序。

江达小记