Rust 基础(一)

Rust 1.65 (发布于2022-11-03)

一、安装

配置环境变量

RUSTUP_HOME
Rustup元数据工具链将被安装到Rustup主目录中
默认: %USERPROFILE%\.rustup

CARGO_HOME
Cargo主目录
cargo、rustc、rustup等命令将被添加到Cargo的bin目录,位于:%USERPROFILE%\.cargo\bin

Rustup 默认目录:$HOME/.rustup
Cargo 默认目录:$HOME/.cargo

1.1 windows 平台

在安装过程中的某个时刻,您将收到一条消息,说明您还需要Visual Studio 2013或更高版本的MSVC构建工具。

要获取构建工具,您需要安装Visual Studio 2022。当被问及要安装哪些时,包括:

  • “Desktop Development with C++”
  • The Windows 10 or 11 SDK
  • The English language pack component, along with any other language pack of your choosing

下载 rustup-init,进行安装

# 安装 x86_64-pc-windows-gnu
rustup +x86_64-pc-windows-gnu update

# 设置默认的toolchain

1.2 Linux或macOS

curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh

该命令下载一个脚本并开始安装rustup工具,该工具将安装最新的稳定版本Rust。系统可能会提示您输入密码。如果安装成功,将出现以下行:

Rust is installed now. Great!

您还需要一个链接器(linker),这是Rust用来将其编译后的输出连接到一个文件中的程序。很可能你已经有了。如果出现链接器错误,则应该安装C编译器,该编译器通常会包含一个链接器C编译器也很有用,因为一些常见的Rust包依赖于C代码,需要C编译器

Linux用户通常应该根据其发行版的文档安装GCC或Clang。例如,如果你使用Ubuntu,你可以安装build-essential包。

# curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
info: downloading installer

Welcome to Rust!

This will download and install the official compiler for the Rust
programming language, and its package manager, Cargo.
#这将下载并安装Rust编程语言的官方编译器,以及它的包管理器Cargo。

Rustup metadata and toolchains will be installed into the Rustup
home directory, located at:

  /root/.rustup

This can be modified with the RUSTUP_HOME environment variable.

The Cargo home directory is located at:

  /root/.cargo

This can be modified with the CARGO_HOME environment variable.

The cargo, rustc, rustup and other commands will be added to
Cargo's bin directory, located at:

  /root/.cargo/bin

This path will then be added to your PATH environment variable by
modifying the profile files located at:

  /root/.profile
  /root/.bashrc

You can uninstall at any time with rustup self uninstall and
these changes will be reverted.

1.3 检查安装

要检查你是否正确安装了Rust,打开shell并输入这行:

$ rustc --version

你应该看到已经发布的最新稳定版本的版本号,提交哈希,和提交日期,以下格式:

rustc 1.68.2 (9eb3afe9e 2023-03-27)

如果您看到这些信息,说明您已经成功安装了Rust !

用 rustup 进行工具链管理

Rustrustup 工具进行安装和管理,Rust有一个6周的快速发布过程,支持大量的平台, 所以在任何时候都有很多版本的Rust可用。rustup 以一致的方式在Rust支持的每个平台上管理这些构建,支持从beta和夜间发布渠道安装Rust,以及支持额外的交叉编译目标。

如果您过去安装过rustup,那么可以通过运行rustup update来更新安装。

配置PATH环境变量

Rust开发环境中,所有工具都安装到~/.cargo/bin目录下,在这里可以找到Rust工具链,包括rustccargorustup

因此,Rust开发人员习惯将此目录包含在PATH环境变量中。在rustup安装过程中,将尝试配置PATH。由于平台、命令shell之间的差异以及rustup中的错误,对PATH的修改可能要等到重新启动控制台或用户注销后才能生效,或者根本无法成功。

如果在安装之后,在控制台中运行rustc --version失败,这是最有可能的原因。

更新 Rust

一旦通过rustup安装了Rust,更新到新发布的版本就很容易了。在shell中运行以下更新脚本:

rustup update

卸载 Rust

如果在任何时候你想卸载Rust,你可以运行rustup self uninstall

镜像源配置

Cargo主目录下新建一个config文件:
vi ~/.cargo/config

清华大学的镜像:

[source.crates-io]
replace-with = 'tuna'

[source.tuna]
registry = "https://mirrors.tuna.tsinghua.edu.cn/git/crates.io-index"

中科大:

[source.crates-io]
replace-with = 'ustc'
[source.ustc]
registry = "https://mirrors.ustc.edu.cn/crates.io-index"
[http]
check-revoke = false

Rustup 镜像使用帮助

# 清华
echo 'export RUSTUP_UPDATE_ROOT=https://mirrors.tuna.tsinghua.edu.cn/rustup/rustup' >> ~/.bash_profile
echo 'export RUSTUP_DIST_SERVER=https://mirrors.tuna.tsinghua.edu.cn/rustup' >> ~/.bash_profile

注:rustup 在判断是否需要更新时依赖于 toml 的 sha256,由于 toml 内容中相关链接被替换为镜像源,第一次切换到镜像源时各个 channel 会被认为需要更新。

查看环境变量

In Windows CMD, use: echo %PATH%
In PowerShell, use: echo $env:Path
In Linux and macOS, use: echo $PATH

Rust标准库位置的路径

Windows上的位置(假设稳定/x64)

C:\Users\<user>\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\src\rust\src

学习Rust

《Rust编程语言》被亲切地称为“the book”,它将从基本原理出发,为您提供该语言的概述。您将在此过程中构建一些项目,到最后,您将对该语言有一个坚实的掌握。

另外,Rustlings指导您下载和设置Rust工具链,并教你在命令行上阅读和编写Rust语法的基础知识。它是Rust by Example的另一种选择,适用于您自己的环境。

如果阅读数百页关于一门语言的内容不是你的风格,那么Rust By Example可以满足你。虽然书中用大量的词汇来讨论代码,但RBE展示了大量的代码,并将对话保持在最低限度。它还包括练习!

文档

所有这些文档也可以使用rustup doc命令在本地获得,该命令将在浏览器中为您打开这些资源,而不需要网络连接!

  • 标准库
    Rust标准库api的综合指南。
  • Edition Guide
    Rust版本指南。
  • Cargo Book
    一本关于Rust包管理器和构建系统的书。
  • rustdoc Book
    学习如何为你的crate制作出色的文档。
  • rustc Book
    熟悉Rust编译器中可用的开关。
  • Compiler Error Index
    深入解释您可能从Rust编译器中看到的错误。

在应用领域培养技能

  • Command Line Book
    学习如何在Rust中构建有效的命令行应用程序。
  • WebAssembly Book
    使用Rust通过WebAssembly构建浏览器原生库。
  • Embedded Book
    精通Rust微控制器和其他嵌入式系统。

Master Rust

对语言最黑暗的角落感到好奇吗?下面是你可以了解细节的地方:

  • Read the reference
    参考不是正式的规范,但比the book更详细和全面。

  • Read the ’nomicon
    Rustonomicon 是你了解不安全Rust的黑魔法的指南。它有时也被称为“the ’nomicon”。

  • Read the unstable book
    Unstable Book 是有不稳定特性的文档,你只能在nightly Rust中使用。

Rust Forge (Contributor Documentation)

Rust Forge
Rust Forge作为补充文档的存储库,对Rust编程语言的成员很有用。如果你发现任何错误,拼写错误,或者想要添加到Rust Forge,请随时在Rust Forge GitHub上提交问题或PR。

二、入门

本文假设您使用的是Rust 1.65(发布于2022-11-03)或更高版本。请参阅第1章的“安装”部分来安装或更新Rust。

HTML格式可以在https://doc.rust-lang.org/stable/book/上在线获得,也可以通过rustup安装Rust来脱机查看。运行rustup docs --book打开。

2.1 编写和运行Rust程序

Rust文件总是以.rs扩展名结束。
如果在文件名中使用了多个单词,约定使用下划线分隔它们。例如,使用hello_world.rs,而不是helloworld.rs

文件:main.rs

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

编译并运行该文件:

$ rustc main.rs
$ ./main
Hello, world!

2.1.1 Rust程序的解剖

1)

fn main() {

}

这几行定义了一个名为main的函数。main 函数很特殊:它总是运行在每个可执行Rust程序中的第一个代码。
如果有参数,它们将放在括号()中。
函数体被包装在{}

将左花括号与函数声明放在同一行上,中间加一个空格是很好的风格。
如果想在Rust项目中坚持一个标准的样式,可以使用一个名为rustfmt的自动格式化工具以特定的样式格式化您的代码(关于rustfmt的更多信息)。

    println!("Hello, world!");

首先,Rust样式是用四个空格缩进,而不是制表符。
第二, println !调用了一个 Rust宏(Rust macro)。
如果它调用了一个函数,那么它将被输入为println(不带!)。

使用!意味着调用的是宏而不是普通函数,而且宏并不总是遵循与函数相同的规则。

第三,我们将“Hello, world!”字符串作为参数传递给println!
第四,我们用分号(;)结束这一行,这表示这个表达式结束了,下一个已经准备好开始了。Rust代码的大多数行都以分号结尾

2.1.2 编译和运行是独立的步骤

在运行Rust程序之前,必须使用Rust编译器编译它,输入rustc命令并传入源文件的名称,像这样:

rustc main.rs

如果有C或c++背景,您会注意到这类似于gcc或clang。编译成功后,Rust输出一个二进制可执行文件。

在使用Windows时,包含扩展名为.pdb的调试信息的文件(main.pdb)

如果更熟悉动态语言,如Ruby、Python或JavaScript,可能不习惯将程序编译和运行作为单独的步骤。
Rust是一种预先编译的语言,这意味着您可以编译一个程序并将可执行文件交给其他人,他们甚至可以在没有安装Rust的情况下运行它。如果您给某人一个.rb.py.js文件,他们需要(分别)安装一个RubyPythonJavaScript实现

对于简单的程序,用rustc编译就可以了,

2.2 Hello, Cargo!

大多数Rustaceans使用这个工具来管理他们的Rust项目,因为Cargo为您处理了很多任务,比如构建代码、下载代码所依赖的库,以及构建这些库。(我们称代码需要的库为依赖项(dependencies

绝大多数Rust项目都使用Cargo

2.2.1 生成一个新项目

首先,我们将使用Cargo为我们创建一个新项目

cargo new hello-rust
#Created binary (application) `hello-rust` package

这将生成一个名为hello-rust的新目录和项目,包含以下文件:

hello-rust
|- Cargo.toml
|- src
  |- main.rs

Cargo.toml

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

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

[dependencies]

是Rust的清单文件。它是保存项目元数据以及依赖项的地方
该文件是TOML (Tom 's Obvious, Minimal Language)格式,这是Cargo的配置格式。

第一行[package]是一个节(section )的标题,表示下面的语句正在配置一个包
接下来的三行设置了Cargo编译程序所需的配置信息:名称、版本和要使用的Rust版本。我们将在附录E中讨论edition key 。
最后一行[dependencies]是列出项目依赖项的部分的开始。在Rust中,代码包被称为crate。在这个项目中我们不需要任何其他的crates

src/main.rs 是我们编写应用程序代码的地方

它还初始化了一个新的Git存储库和一个.gitignore文件。如果在现有的Git存储库中运行cargo new,则不会生成Git文件;你可以通过使用cargo new --vcs=git来覆盖这种行为

注意:Git是一个通用的版本控制系统。通过使用--vcs标志,你可以改变cargo new使用不同的版本控制系统或不使用版本控制系统。运行cargo new --help查看可用选项。

Cargo希望源文件位于src目录中。顶级项目目录仅用于存放README文件、许可信息、配置文件和其他与代码无关的内容。使用Cargo可以帮助您组织项目。每样东西都有一个地方,每样东西都在它的地方。

2.2.2 建立和运行一个Cargo 项目

hello_rust目录中,输入以下命令构建项目:

cargo build

这个命令在target/debug/hello_rust(或在Windows上target\debug\hello_rust.exe)中创建一个可执行文件,而不是在当前目录中。
因为默认构建是调试构建,所以Cargo将二进制文件放在名为debug的目录中。你可以用这个命令运行可执行文件:

$ ./target/debug/hello_rust # or .\target\debug\hello_rust.exe on Windows
Hello, world!

第一次运行cargo build还会导致cargo在顶层创建一个新文件:cargo.lock。该文件跟踪项目中依赖项的确切版本。这个项目没有依赖项,所以文件有点稀疏。你不需要手动修改这个文件,Cargo为您管理它的内容。

我们也可以使用cargo run来编译代码,然后运行可执行文件

Cargo还提供了一个名为Cargo check的命令。这个命令可以快速检查你的代码,确保它可以编译,但不会生成可执行文件
通常,cargo checkcargo build,要快得多,因为它跳过了生成可执行文件的步骤。

使用Cargo的另一个优点是,无论在哪个操作系统上工作,命令都是相同的。

2.2.3 Building for Release

当项目最终准备好发布时,可以使用cargo build --release对其进行优化编译。这个命令将在target/release而不是target/debug中创建一个可执行文件。
如果正在对代码的运行时间进行基准测试,请确保运行cargo build --release和使用target/release中的可执行文件进行基准测试。

2.2.4 Cargo 作为约定

尽管hello_rust项目很简单,但它现在使用了将在Rust职业生涯的其余部分中使用的许多实际工具。
有关Cargo的更多信息

2.2.5 添加依赖

你可以在 crates.io(Rust的包注册中心)上找到各种各样的库。 在Rust中,我们经常将包称为“crate”。
在Cargo.toml文件中,添加以下信息(可从crate 页面):

[dependencies]
ferris-says = "0.2"

Now we can run:

cargo build

Cargo将为我们安装依赖项。

您将看到运行此命令为我们创建了一个新文件Cargo.lock。该文件是本地使用的依赖项的确切版本的日志。
在main.rs中

use ferris_says::say;
use std::io::{stdout, BufWriter};

fn main() {
    let stdout = stdout();
    let message = String::from("Hello fellow Rustaceans!");
    let width = message.chars().count();

    let mut writer = BufWriter::new(stdout.lock());
    say(message.as_bytes(), width, &mut writer).unwrap();
}

Rust-wasm入门:编译出第一个wasm模块

你可能感兴趣的:(Rust,rust,开发语言,后端)