2022 年学习 Rust

如果您今年打算探索 Rust,请下载我们的免费 Rust 速查表,以便您快速参考基础知识。
71 位读者喜欢这篇文章。
Blender Hotkey Cheat Sheet

Opensource.com

Rust 是一种相对较新的编程语言,但它已经很受欢迎,赢得了 各行各业的程序员的青睐。尽管如此,它也是一种建立在之前一切基础之上的语言。毕竟,Rust 不是一天造成的,所以即使 Rust 中有些概念看起来与您可能从 Python、Java、C++ 等语言中学到的东西截然不同,但它们都建立在您一直(无论您是否知道)与之交互的相同的 CPU 和 NUMA 架构之上,因此 Rust 中的一些新事物感觉有点熟悉。

现在,我不是一个以编程为业的程序员。我既没有耐心又很执着。如果一种语言不能帮助我相对快速地获得我想要的结果,那么当我需要完成某件事时,我很少发现自己有灵感去使用它。Rust 试图平衡两个相互冲突的事物:现代计算机对安全和结构化代码的需求,以及现代程序员在获得更多成功的同时减少工作量的愿望。

安装 Rust

rust-lang.org 网站上有关于安装 Rust 的出色文档,但通常,它就像下载 sh.rustup.rs 脚本并运行它一样简单。

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

$ less sh.rustup.sh

$ sh ./sh.rustup.rs

没有类

Rust 没有类,也不使用 class 关键字。但是,Rust 确实有 struct 数据类型,其目的是充当数据集合的模板。因此,您可以不创建类来表示虚拟对象,而是可以使用 struct

struct Penguin {
    genus: String,
    species: String,
    extinct: bool,
    classified: u64,
}

您可以像使用类一样使用它。例如,一旦定义了 Penguin struct,您就可以创建它的实例并与该实例交互

struct Penguin {
    genus: String,
    species: String,
    extinct: bool,
    classified: u64,
}

fn main() {
    let p = Penguin { genus: "Pygoscelis".to_owned(),
         species: "R adeliæ".to_owned(), 
         extinct: false, 
         classified: 1841 };

    println!("Species: {}", p.species);    
    println!("Genus: {}", p.genus);
    println!("Classified in {}", p.classified);
    if p.extinct == true {
        println!("Sadly this penguin has been made extinct.");
    }
    
}

结合使用 impl 数据类型和 struct 数据类型,您可以实现包含函数的 struct,并且可以添加继承和其他类似类的功能。

函数

Rust 中的函数与其他语言中的函数非常相似。每个函数都代表一组您可以根据需要调用的离散任务。主函数必须称为 main

函数使用 fn 关键字声明,后跟函数名称和函数接受的任何参数。

fn foo() {
  let n = 8;
  println!("Eight is written as {}", n);
}

从一个函数向另一个函数传递信息是通过参数完成的。例如,我已经创建了一个 Penguin 类,并且我有一个 penguin 的实例作为 p,因此将 p 的属性从一个函数传递到另一个函数需要我将 p 指定为其目标函数接受的 Penguin 类型。

fn main() {
  let p = Penguin { genus: "Pygoscelis".to_owned(), 
    species: "R adeliæ".to_owned(), 
    extinct: false, classified: 1841 };
  printer(p);
}

fn printer(p: Penguin) {
  println!("Species: {}", p.species);    
  println!("Genus: {}", p.genus);
  println!("Classified in {}", p.classified);
  if p.extinct == true {
      println!("Sadly this penguin has been made extinct.");
  }
}

变量

Rust 默认创建不可变变量。这意味着您创建的变量稍后无法更改。这段代码,虽然简单,但无法编译

fn main() {
 let n = 6;
 let n = 5;
 }

但是,您可以使用关键字 mut 声明可变变量,因此这段代码可以成功编译

fn main() {
 let mut n = 6;
 println!("Value is {}", n);
 n = 5;
 println!("Value is {}", n);
}

编译器

Rust 编译器,至少就其错误消息而言,是可用的最好的编译器之一。当您在 Rust 中做错事时,编译器会真诚地努力告诉您您做错了什么。实际上,我通过从编译器错误消息中学习,了解了 Rust 的许多细微之处(就我理解 Rust 的任何细微之处而言)。即使错误消息太晦涩难懂,无法直接从中学习,但几乎总是足以进行互联网搜索来解释。

启动 Rust 程序的最简单方法是使用 cargo,Rust 包管理和构建系统。

$ mkdir myproject
$ cd myproject
$ cargo init 

这为项目创建了基本的基础结构,最值得注意的是 src 子目录中的 main.rs 文件。打开此文件并将我为本文生成的示例代码粘贴进去

struct Penguin {
    genus: String,
    species: String,
    extinct: bool,
    classified: u64,
}

fn main() {
    let p = Penguin { genus: "Pygoscelis".to_owned(), species: "R adeliæ".to_owned(), extinct: false, classified: 1841 };
    printer(p);
    foo();
}

fn printer(p: Penguin) {
    println!("Species: {}", p.species);    
    println!("Genus: {}", p.genus);
    println!("Classified in {}", p.classified);
    if p.extinct == true {
        println!("Sadly this penguin has been made extinct.");
    }
}

fn foo() {
     let mut n = 6;
 println!("Value is {}", n);
 n = 8;
  println!("Eight is written as {}", n);
}

要编译,请使用 cargo build 命令

$ cargo build

要运行您的项目,请执行 target 子目录中的二进制文件,或者直接使用 cargo run

$ cargo run
Species: R adeliæ
Genus: Pygoscelis
Classified in 1841
Value is 6
Eight is written as 8

Crates

任何语言的便利性很大程度上来自其库或模块。在 Rust 中,库作为“crates”分发和跟踪。crates.io 网站是社区 crates 的良好注册表。

要将 crate 添加到您的 Rust 项目,请在 Cargo.toml 文件中列出它们。例如,要安装随机数函数,我使用 rand crate,其中 * 用作通配符,以确保我在编译时获得最新版本

[package]
name = "myproject"
version = "0.1.0"
authors = ["Seth <seth@opensource.com>"]
edition = "2022"

[dependencies]
rand = "*"

在 Rust 代码中使用它需要在顶部使用 use 语句

use rand::Rng;

一些创建随机种子然后创建随机范围的示例代码

fn foo() {
    let mut rng = rand::thread_rng();
    let mut n = rng.gen_range(1..99);

    println!("Value is {}", n);
    n = rng.gen_range(1..99);
    println!("Value is {}", n);
}

您可以使用 cargo run 运行它,这将检测到代码更改并触发新的构建。构建过程下载 rand crate 以及它所依赖的所有 crates,编译代码,然后运行它

$ cargo run
Updating crates.io index
Downloaded ppv-lite86 v0.2.16
Downloaded 1 crate (22.2 KB) in 1.40s
 Compiling libc v0.2.112
 Compiling cfg-if v1.0.0
 Compiling ppv-lite86 v0.2.16
 Compiling getrandom v0.2.3
 Compiling rand_core v0.6.3
 Compiling rand_chacha v0.3.1
 Compiling rand v0.8.4
 Compiling rustpenguin v0.1.0 (/home/sek/Demo/rustpenguin)
 Finished dev [unoptimized + debuginfo] target(s) in 13.97s
 Running `target/debug/rustpenguin`

Species: R adeliæ
Genus: Pygoscelis
Classified in 1841
Value is 70
Value is 35

Rust 速查表

Rust 是一种非常令人愉悦的语言。由于它与在线注册表的集成、有用的编译器以及几乎直观的语法,它感觉非常现代。

但请不要误会,它也是一种复杂的语言,具有严格的数据类型、强作用域变量和许多内置方法。Rust 值得一看,如果您打算探索 Rust,那么您应该下载我们的免费Rust 速查表,以便您快速参考基础知识。您越早开始,就越早了解 Rust。当然,您应该经常练习以避免生疏。

接下来阅读什么
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算机行业工作,经常同时工作。

2 条评论

您好,

我很欣赏您在 opensource.com 上发表的众多文章。

有时,我想将它们翻译成法语并分享译文。

鉴于
Opensource.com 渴望根据知识共享许可发布所有内容,但在某些情况下可能无法做到这一点。您有责任确保您拥有在本网站上重复使用任何作品的必要许可。

我想确认您在 opensource.com 上的所有文章都受 cc-by-sa 许可协议的保护,并且您不介意我翻译其中的一些文章并在 linuxfr.org 上分享。

此致敬礼

我确认 Seth Kenlon(就是我!)为 Opensource.com 撰写的所有材料至少都受 CC BY-SA 许可协议的保护,因此您可以自由地执行 https://creativecommons.org/licenses/by-sa/4.0/legalcode.txt 许可协议允许的任何操作

回复 作者 tisaac

知识共享许可协议本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.