Rust Hello World

1. Rust Hello World

1.1. 项目目录

需要创建一个存放 Rust 代码的目录。Rust 并不关心代码的存放位置, 我们建议你在 home 目录中创建 projects 目录, 并将你的所有项目存放在这里。

$ mkdir ~/projects
$ cd ~/projects
$ mkdir hello_world
$ cd hello_world

新建一个源文件, 命名为 main.rs。Rust 源文件总是以 .rs 扩展名结尾。如果文件名包含多个单词, 那么按照命名习惯, 应当使用下划线来分隔单词。例如命名为 hello_world.rs, 而不是 helloworld.rs

1.2. Hello World

文件名: main.rs

fn main() {
    println!("Hello, world!");
}
$ rustc main.rs
$ ./main
Hello, world!

main 函数中有如下代码:

    println!("Hello, world!");

这里有四个重要的细节需要注意。

  • 首先 Rust 的缩进风格使用 4 个空格, 而不是 1 个制表符 (tab)。
  • 第二, println! 调用了一个 Rust 宏 (macro)。如果是调用函数, 则应输入 println(没有!)。现在你只需记住, 当看到符号 ! 的时候, 就意味着调用的是宏而不是普通函数, 并且宏并不总是遵循与函数相同的规则。
  • 第三, “Hello, world!” 是一个字符串。我们把这个字符串作为一个参数传递给 println!, 字符串将被打印到屏幕上。
  • 第四, 该行以分号结尾 (;), 这代表一个表达式的结束和下一个表达式的开始。大部分 Rust 代码行以分号结尾。

Rust 是一种 预编译静态类型 (ahead-of-time compiled) 语言, 这意味着你可以编译程序, 并将可执行文件送给其他人, 他们甚至不需要安装 Rust 就可以运行。如果你给他人一个 .rb.py.js 文件, 他们需要先分别安装 Ruby, Python, JavaScript 实现(运行时环境, VM)。

仅仅使用 rustc 编译简单程序是没问题的, 不过随着项目的增长, 你可能需要管理你项目的方方面面, 并让代码易于分享。接下来, 我们要介绍一个叫做 Cargo 的工具, 它会帮助你编写真实世界中的 Rust 程序。

1.3. Hello, Cargo!

Cargo 是 Rust 的构建系统和包管理器。大多数 Rustacean 们使用 Cargo 来管理他们的 Rust 项目, 因为它可以为你处理很多任务, 比如构建代码、下载依赖库并编译这些库。(我们把代码所需要的库叫做 依赖(dependencies))。

可以在终端输入如下命令检查是否安装了 Cargo:

$ cargo --version

1.3.1. 使用 Cargo 创建项目

回到 projects 目录(或者你存放代码的目录)。

$ cargo new hello_cargo
$ cd hello_cargo

进入 hello_cargo 目录并列出文件。将会看到 Cargo 生成了两个文件和一个目录: 一个 Cargo.toml 文件, 一个 src 目录, 以及位于 src 目录中的 main.rs 文件。

这也会在 hello_cargo 目录初始化了一个 git 仓库, 以及一个 .gitignore 文件。如果在一个已经存在的 git 仓库中运行 cargo new, 则这些 git 相关文件则不会生成; 可以通过运行 cargo new --vcs=git 来覆盖这些行为。

注意: Git 是一个常用的版本控制系统(version control system, VCS)。可以通过 --vcs 参数使 cargo new 切换到其它版本控制系统(VCS), 或者不使用 VCS。运行 cargo new --help 参看可用的选项。

.
├── .git
├── .gitignore
├── Cargo.toml
└── src
    └── main.rs

文件名: Cargo.toml

[package]
name = "hello_cargo"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]

这是 Cargo 配置文件的格式。

  • 第一行, [package], 是一个片段(section)标题, 表明下面的语句用来配置一个包。随着我们在这个文件增加更多的信息, 还将增加其他片段(section)。
  • 接下来的三行设置了 Cargo 编译程序所需的配置: 项目的名称、项目的版本以及要使用的 Rust 版本。附录 E 会介绍 edition 的值。
  • 最后一行, [dependencies], 是罗列项目依赖的片段的开始。在 Rust 中, 代码包被称为 crates。这个项目并不需要其他的 crate

1.3.2. 构建并运行 Cargo 项目

hello_cargo 目录下, 输入下面的命令来构建项目:

$ cargo build
   Compiling hello_cargo v0.1.0 (file:///projects/hello_cargo)
    Finished dev [unoptimized + debuginfo] target(s) in 2.85 secs

这个命令会创建一个可执行文件 target/debug/hello_cargo, 而不是放在目前目录下。由于默认的构建方法是调试构建(debug build), Cargo 会将可执行文件放在名为 debug 的目录中。可以通过这个命令运行可执行文件:

$ ./target/debug/hello_cargo # 或者在 Windows 下为 .\target\debug\hello_cargo.exe
Hello, world!

首次运行 cargo build 时, 也会使 Cargo 在项目根目录创建一个新文件: Cargo.lock。这个文件记录项目依赖的实际版本。这个项目并没有依赖, 所以其内容比较少。你自己永远也不需要碰这个文件, 让 Cargo 处理它就行了。

我们刚刚使用 cargo build 构建了项目, 并使用 ./target/debug/hello_cargo 运行了程序, 也可以使用 cargo run 在一个命令中同时编译并运行生成的可执行文件:

$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.0 secs
     Running `target/debug/hello_cargo`
Hello, world!

比起要记得运行 cargo build 之后再用可执行文件的完整路径来运行程序, 使用 cargo run 可以实现完全相同的效果, 而且要方便得多, 所以大多数开发者会使用 cargo run

注意这一次并没有出现表明 Cargo 正在编译 hello_cargo 的输出。Cargo 发现文件并没有被改变, 所以它并没有重新编译, 而是直接运行了可执行文件。如果修改了源文件的话, Cargo 会在运行之前重新构建项目, 并会出现像这样的输出:

$ cargo run
   Compiling hello_cargo v0.1.0 (file:///projects/hello_cargo)
    Finished dev [unoptimized + debuginfo] target(s) in 0.33 secs
     Running `target/debug/hello_cargo`
Hello, world!

Cargo 还提供了一个叫 cargo check 的命令。该命令快速检查代码确保其可以编译, 但并不产生可执行文件:

$ cargo check
   Checking hello_cargo v0.1.0 (file:///projects/hello_cargo)
    Finished dev [unoptimized + debuginfo] target(s) in 0.32 secs

为什么你会不需要可执行文件呢? 通常 cargo check 要比 cargo build 快得多, 因为它省略了生成可执行文件的步骤。如果你在编写代码时持续的进行检查, cargo check 可以让你快速了解现在的代码能不能正常通过编译! 为此很多 Rustaceans 编写代码时定期运行 cargo check 确保它们可以编译。当准备好使用可执行文件时才运行 cargo build

1.3.3. 发布(release)构建

当项目最终准备好发布时, 可以使用 cargo build --release 来优化编译项目。这会在 target/release 而不是 target/debug 下生成可执行文件。这些优化可以让 Rust 代码运行的更快, 不过启用这些优化也需要消耗更长的编译时间。这也就是为什么会有两种不同的配置: 一种是为了开发, 你需要经常快速重新构建; 另一种是为用户构建最终程序, 它们不会经常重新构建, 并且希望程序运行得越快越好。如果你在测试代码的运行时间, 请确保运行 cargo build --release 并使用 target/release 下的可执行文件进行测试。

1.3.4. 把 Cargo 当作习惯

对于简单项目, Cargo 并不比 rustc 提供了更多的优势,不过随着开发的深入,终将证明其价值。一旦程序壮大到由多个文件组成,亦或者是需要其他的依赖,让 Cargo 协调构建过程就会简单得多。

即便 hello_cargo 项目十分简单,它现在也使用了很多在你之后的 Rust 生涯将会用到的实用工具。其实,要在任何已存在的项目上工作时,可以使用如下命令通过 Git 检出代码,移动到该项目目录并构建:

$ git clone example.org/someproject
$ cd someproject
$ cargo build

关于更多 Cargo 的信息,请查阅 其文档

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云满笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值