Rust 入门

Rust 工具链安装程序在 https://www.rustup.rs/ 。 以下命令将在系统上安装工具链的所有三个版本。对于本书中的示例, 我们将使用运行 Ubuntu 16.04 的 Linux 计算机。虽然大多数 Rust 不应依赖于操作系统, 但可能会有一些细微的差异。

我们将指出操作系统上的任何严格依赖关系:

curl https://sh.rustup.rs -sSf | sh
source $HOME/.cargo/env
rustup install nightly beta

我们需要将 Cargo 的 bin 目录添加到 系统环境变量 PATH 中,通过编辑 .bashrc 或者:

echo "export PATH=$HOME/.cargo/bin:$PATH" >> ~/.bashrc

Rust 安装附带了大量的文档;它们可以通过运行以下命令进行访问。这应该会在浏览器窗口中打开文档:

rustup doc

下一步创建一个 Rust 项目并运行它,使用 cargo:


# #![allow(unused_variables)]
#fn main() {
cargo new --bin hello-rust
#}

它告诉 Cargo 在当前目录下建立一个名为 hello-rust 的项目。cargo 将创建该名称的目录,并设置基本结构。由于项目的类型设置为二进制, cargo 将生成一个名为 main.rs 的文件,该文件有一个空的 main 函数,即整个应用程序的入口点。这里的另一个(默认)选择是库,在这种情况下,将生成一个 lib.rs 的文件。名为 cargo.toml 的文件有一堆当前项目的元数据,由 Cargo 使用。所有源代码在 src 目录下:

# tree hello-rust/
hello-rust/
├── Cargo.toml
└── src
└── main.rs

1 directory, 2 files

然后,可以使用以下命令生成和运行该项目。请注意,此命令应该从 Cargo 创建的 hello-rust 目录中运行:

cargo run

有趣的是, 此命令对目录进行了相当大的修改。 target 目录包含编译项目。它的结构在很大程度上依赖于平台, 但始终包括在给定的生成模式下运行应用程序所需的一切。默认生成模式是 debug , 其中包括调试信息和要与调试器一起使用的符号:

# tree hello-rust/
hello-rust/
├── Cargo.lock
├── Cargo.toml
├── src
│   └── main.rs
└── target
└── debug
├── build
├── deps
│ └── hello_rust-392ba379262c5523
├── examples
├── hello-rust
├── hello-rust.d
├── incremental
└── native

8 directories, 6 files

打包的 Rust 应用叫做 crate 。Rust crate 发布到 crate.io 。 发布后,任何人都可以使用 web 界面或者 cargo CLI 查找 crates。如下面代码所示。这个操作需要连网以便 cargo 与 crates.io 通信:

# cargo search term
Updating registry `https://github.com/rust-lang/crates.io-index`
term = "0.4.6" # A terminal formatting library
ansi_term = "0.9.0" # Library for ANSI terminal colours and styles (bold, underline)
term-painter = "0.2.4" # Coloring and formatting terminal output
term_size = "0.3.0" # functions for determining terminal sizes and dimensions
rust_erl_ext = "0.2.1" # Erlang external term format codec.

slog-term = "2.2.0" # Unix terminal drain and formatter for slog-rs
colored = "1.5.2" # The most simple way to add colors in your terminal
term_grid = "0.1.6" # Library for formatting strings into a grid layout
rust-tfidf = "1.0.4" # Library to calculate TF-IDF (Term Frequency Inverse Document Frequency) for generic documents
aterm = "0.20.0" # Implementation of the Annotated Terms data structure ... and 1147 crates more (use --limit N to see more)

现在, 说我们要在我们的应用程序中使用 term ;我们将需要编辑 Cargo. toml 文件, 并将其包w含在 [dependencies] 部分, 如下面的代码段所示。这个特殊的 crate 有助于格式化终端颜色。使用这个 crate , 我们想打印的单词 helloworld ,用绿色和红色分别显示:

[package]
name = "hello-rust"
version = "0.1.0"
authors = ["Foo Bar <foo.bar@foobar.com>"]

[dependencies]
term = "0.4.6"

要在程序中使用 term ,我们需要编辑 main.rs 如下面代码段所示。我们将在后面的章节中详细讨论语言, 但这里有一个小概述。下面的示例是一个简单的程序在屏幕上打印 hello world! 绿色的 hello , 红色的 world!

// chapter2/hello-rust/src/main.rs

extern crate term;

fn main() {

    let mut t = term::stdout().unwrap(); 
    t.fg(term::color::GREEN).unwrap(); write!(t, "hello, ").unwrap();

    t.fg(term::color::RED).unwrap(); writeln!(t, "world!").unwrap();

    t.reset().unwrap();

}

在 Rust 中, 每个应用程序都必须有一个称为 main 的入口点, 该入口点应定义为不接受参数的函数。函数是使用 fn 关键字定义的。短语 extern crate 术语告诉工具链, 我们要使用外部 crate 作为我们当前应用程序的依赖项。

现在, 我们可以使用 Cargo 运行它。它自动下载和构建我们需要的库及其所有依赖项。最后, 它调用 Rust 编译器, 以便我们的应用程序与库链接并运行可执行文件。Cargo 还生成一个名为 Cargo.lock 的文件, 该文件包含以一致的方式运行应用程序所需的所有内容的快照。永远不要手动编辑此文件。由于货物在本地缓存所有依赖项, 因此后续调用不需要互联网访问:

$ cargo run 
        Updating registry `https://github.com/rust-lang/crates.io-index` 
    Compiling term v0.4.6 
    Compiling hello-rust v0.1.0 (file:///Users/Abhishek/Desktop/rustbook/src/chapter2/hello-rust) 
    Finished dev [unoptimized + debuginfo] target(s) in 3.20 secs 
    Running `target/debug/hello-rust` 
hello, world!