Rust的独特功能

要确定某种编程语言是否适合您的项目,您需要了解其功能和限制。然后您可以比较可能的语言并选择最适合的一种。

在本单元中,我们将回顾 Rust 的一些特性和限制:

  • Rust 模块系统:模块、板条箱和路径
  • Rust 标准库和第三方 crate
  • Rust Cargo 工具和依赖管理器
  • 何时使用 Rust

使用 Rust 模块系统管理代码
Rust 提供了一系列功能来帮助您管理和组织代码。这些功能被称为Rust 模块系统。该系统由crates、modules、paths以及处理这些项目的工具组成。

  • crate板条箱:Rust 板条箱是一个编译单元。这是 Rust 编译器可以运行的最小代码段。包中的代码被编译在一起以创建二进制可执行文件或库。在 Rust 中,只有板条箱被编译为可重用单元。板条箱包含 Rust 模块的层次结构,以及隐式的、未命名的顶级模块。
  • 模块:Rust 模块可让您管理 crate 内各个代码项的范围,从而帮助您组织程序。相关的代码项或一起使用的项可以分组到同一模块中。递归代码定义可以跨越其他模块。
  • 路径:在 Rust 中,您可以使用路径来命名代码中的项目。例如,路径可以是数据定义,如向量、代码函数,甚至模块。该模块功能还可以帮助您控制路径的隐私。您可以指定代码中可公开访问的部分和私有部分。此功能允许您隐藏实现细节。

使用 Rust crate和库
Rust 标准库std包含 Rust 程序中基本定义和操作的可重用代码。该库具有核心数据类型(如Stringand )的定义Vec<T>、Rust 原语的操作、常用宏函数的代码、对输入和输出操作的支持以及许多其他功能领域。

Rust 程序中有数以万计的库和第三方 crate 可供使用,其中大部分可以通过 Rust 的第三方 crate 存储库crates.io访问。稍后您将了解如何从项目中访问这些 crate,但现在这里是编程练习中使用的一些 crate:

  • std - Rust 标准库。在 Rust 练习中,您会注意到以下模块:
    • std::collections - 集合类型的定义,例如HashMap.
    • std::env - 用于处理您的环境的函数。
    • std::fmt - 控制输出格式的功能。
    • std::fs - 用于处理文件系统的函数。
    • std::io - 用于输入/输出的定义和功能。
    • std::path - 支持使用文件系统路径数据的定义和函数。
  • structopt - 用于轻松解析命令行参数的第三方包。
  • chrono - 用于处理日期和时间数据的第三方包。
  • regex - 使用正则表达式的第三方箱。
  • serde - Rust 数据结构的序列化和反序列化操作的第三方包。

默认情况下,该std库可供所有 Rust 箱使用。为了访问板条箱或库中的可重用代码,我们实现了关键字use。使用use关键字,包或库中的代码将“进入范围”,以便您可以访问程序中的定义和函数。标准库是在use带有路径的语句中访问的std,如 中所示use std::fmt。其他板条箱或库可通过其名称进行访问,例如use regex::Regex.

使用 Cargo 创建和管理项目
虽然可以rustc直接使用 Rust 编译器 ( ) 来构建 crate,但大多数项目都使用 Rust 构建工具和名为Cargo的依赖管理器。
Cargo 可以为您做很多事情,包括:

  • 使用命令创建新的项目模板cargo new。
  • 使用命令构建项目cargo build。
  • 使用命令构建并运行项目cargo run。
  • 使用命令测试项目cargo test。
  • 使用命令检查项目类型cargo check。
  • 使用命令构建项目文档cargo doc。
  • crates.io使用命令发布库cargo publish。
  • 通过将 crate 名称添加到 Cargo.toml 文件,将依赖 crate 添加到项目中。

何时使用 Rust
在为您的项目选择最佳语言时,Rust 语言有很多优点需要考虑:

  • Rust 允许控制用与 C 和 C++ 相同的语言编写的程序和库的性能和资源消耗,同时默认情况下仍然是内存安全的。这种级别的控制消除了所有类别的常见错误。
  • Rust 具有丰富的抽象功能,允许开发人员将程序的许多不变量编码为代码。然后由编译器检查代码,而不是依赖约定或文档。这个特性常常会让人产生“如果能编译,它就能工作”的感觉。
  • Rust 具有用于构建、测试、记录和共享代码的内置工具以及丰富的第三方工具和库生态系统。这些工具可以使一些在某些语言中困难的任务,例如构建依赖关系,在 Rust 中变得简单而高效。