2022 Rust 入门指南

开发 后端
如果你打算在今年探索 Rust,请下载我们的免费 Rust 速查表,以供快速参考基础知识。

Rust 是一门相对较新的编程语言,受到各个企业的程序员的欢迎。尽管如此,它仍是一门建立在之前所有事物之上的语言。毕竟,Rust 不是一天做出来的,所以即便 Rust 中的一些概念看起来与你从 Python、Java、C++ 等编程语言学到的东西大不相同,但它们都是基于同一个基础,那就是你一直与之交互(无论你是否知道)的 CPU 和 NUMA(非统一内存访问Non Uniform Memory Access)架构,因此 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 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​​ 数据类型结合使用,你可以实现一个包含函数的结构体,并且可以添加继承和其他与类相似的特性。

函数

Rust 中的函数很像其他语言中的函数。每个函数都代表一组严谨的任务,你可以在需要时调用它们。主函数名必须是 ​​main​​。

用 ​​fn​​ 关键字声明函数,后跟函数名称和函数接受的所有参数。

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

通过参数,将信息从一个函数传递到另一个函数。例如,我已经创建了一个 ​​Penguin​​​ 类(结构),并且我有一个 ​​Penguin​​​ 的实例为 ​​p​​​,将目标函数的参数指定为 ​​Penguin​​​ 类型,就可把 ​​p​​ 的属性从一个函数传递到另一个函数。

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 默认创建的为不可变immutable变量。这意味着你创建的变量以后无法更改。这段代码虽然看起来没问题,但无法编译:

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

但你可以使用关键字 ​​mut​​ 声明一个可变mutable变量,因此下面这段代码可以编译成功:

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 中,进行分发和跟踪的库称为 “crate”(箱子)。​​crates.io​​ 是一个很好的社区 crate 注册网站。

把一个 crate 添加到你的 Rust 项目,首先要在 ​​Cargo.toml​​​ 文件中添加这个 crate。例如,要安装随机数函数,我使用名为 ​​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​​​ 的 ​​crete​​​ 和它依赖的所有 ​​crate​​,编译代码,然后运行它:

$ 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。当然,你应该经常练习以避免生疏。


Rust 速查表


责任编辑:庞桂玉 来源: Linux中国
相关推荐

2023-05-23 18:31:14

Rust编程

2011-03-08 09:22:37

2020-03-13 14:20:02

代码开发 Rust

2010-08-03 15:19:08

FlexBuilder

2021-03-26 10:31:19

人工智能AIOps

2011-05-18 15:15:44

MySQL

2024-01-11 11:51:51

Rustmap数据结构

2024-03-07 09:00:04

Rust数据可视化

2022-05-06 09:51:39

开源代码编辑器语言

2024-03-26 09:25:35

RustSerde重命名

2020-03-09 11:43:35

RustCargo编程语言

2010-07-20 16:13:25

Perl线程

2011-03-08 16:50:35

2010-12-31 13:30:12

2015-09-24 09:54:32

物联网

2019-07-18 07:52:01

路由策略IP路由

2011-01-10 13:21:45

linuxsamba

2013-01-08 13:33:07

Android开发Activity入门指南

2019-10-12 00:24:29

微隔离SDN安全架构

2023-08-09 09:07:21

Rust调查报告
点赞
收藏

51CTO技术栈公众号