Rust语言精简手册

你好,欢迎来到Rust世界!

如果你以前从未接触过Rust,或者你想尝试写个Rust版的Hello World!

你可以尝试在Rust练习场输入以下内容,并运行它:

fn main() {
    println!("Hello World!");
}

恭喜你,你已经成功地迈出学习Rust语言的第一步。

接下来会通过这个Rust语言的精简版,带你感受一下Rust世界的精彩。

数据结构

通过关键字定义的数据类型和内存位置。

示例

解释

struct S {}

定义结构体S示例

struct S { x: T }

定义结构体S,包含一个类型为T的成员x

struct S ​(T);

定义元组结构体S,有一个类型为T.0编号的成员

struct S;

定义零大小的单元结构体S

enum E {}

定义枚举E示例

enum E { A, B​(), C {} }

定义枚举E的成员,可以是单元A元组B结构体C

enum E { A = 1 }

如果成员仅是单元,可以拥有显式辨别值

union U {}

用于FFI兼容的不安全类C的联合体,参见Rust规范

static X: T = T();

具有'static生命周期的全局静态变量,有个固定的内存地址,示例

const X: T = T();

定义常量X,生命周期是全局的,但没有固定的内存地址

let x: T;

在栈上绑定变量x,一次分配,不可变

let mut x: T;

类似let,但允许可变借用

x = y;

y将内存地址转移给x,如果类型TCopy的,则复制y;否则y后续不可用

创建和访问数据结构。

示例

解释

S { x: y }

实例化结构体S{},或枚举E::S{},将成员x设置为y

S { x }

类似上面,但使用了局部变量x

S { ..s }

使用s设置结构体S剩余的成员,对默认值尤其有用,示例

S { 0: x }

类似下面的S(x),设置索引.0成员为x

S​ (x)

设置索引.0成员为x

S

单元结构体S,实例就是其本身

E::C { x: y }

实例化枚举成员C

()

单元类型,唯一的值就是其本身

(x)

括号表达式

(x,)

单元素元组表达式,示例

(S,)

单元素元组类型

[S]

不确定大小的数组,切片,示例

[S; n]

数组类型S表示数组中元素的类型,n表示数组的大小,示例

[x; n]

创建一个包含n份值x的拷贝

[x, y]

定义结构体S示例

x[0]

用于不可变内容的索引操作

x[..]

用作切片的索引操作,示例

x[a..]

生成在索引a之后所有元素的切片

x[..b]

生成在索引b之前所有元素的切片

x[a..b]

生成在索引ab之间所有元素的切片

a..b

创建左闭右开区间的范围类型

a..=b

创建全闭区间的范围类型

s.x

通过字段名访问

s.0

通过索引访问,用于元组类型S(T)

类型别名和强制转换

示例

解释

type T = S;

创建类型T的另一个名字S

Self

用于表示trait和实现中的实现类型

self

用于表示方法对象本身

&self

同上,表示借用

&mut self

同上,表示可变借用

self: Box<Self>

智能指针

S as T

消除歧义,限定类型S使用trait``T

S as R

use语法中,导入SR

x as u32

原生类型的强制类型转换,示例

流程控制

示例

解释

while x {}

while循环,当xtrue时循环,示例

loop {}

无限循环,示例

for x in iter {}

for表达式用于循环遍历迭代器iter示例

if x {} else {}

条件表达式,所有分支必须返回相同的类型,示例

'label: loop {}

标签循环,对嵌套循环中的流程控制很有用,示例

break

使用break退出一个循环

break x

使loop表达式返回值x示例

break 'label

中断'label标签的循环

continue

中断循环体的当前迭代,返回到下一轮循环

continue 'label

中断指定'label标签的循环体的当前迭代,返回到下一轮循环

函数,闭包与trait

定义代码块及其抽象。

示例

解释

trait T {}

定义trait示例

trait T : R {}

TR的子trait,任何类型实现T之前必须实现R

impl S {}

实现类型S

impl T for S {}

为类型S实现trait``T

impl !T for S {}

为类型S禁用自动派生auto traits

fn f() {}

定义函数示例 ,或定义关联函数(在impl内部)

fn f() -> S {}

同上,函数返回值为类型S

fn f(&self) {}

定义方法,作为impl的一部分

fn() -> S

函数指针,示例,不要和trait``Fn混淆

|| {}

闭包,示例

|x| {}

绑定参数x的闭包

|x| x + x

没有块表达式的闭包

move |x| x + y

强制闭包取得被捕获变量的所有权,示例

|| true

没有参数的闭包

生命周期

示例

解释

'a

生命周期参数,示例

&'a S

一个拥有生命周期'a的引用

&'a mut S

同上,但引用的内容可变

S<'a>

一个拥有生命周期'a的类型

fn f<'a>(t: &'a T)

一个函数,其拥有生命周期'a的输入引用,其中'a的存活时间至少与函数的一样长

'static

在整个程序运行的时期中存在

泛型与trait约束

泛型会与许多其他结构相结合,例如:struct S<T>, fn f<T>(), ...

示例

解释

S<T>

具有类型参数T的泛型S示例

S<T: R>

类型S的类型参数T必须实现trait``R示例

T: R, P: S

分别对类型T``P定义约束,类型间用逗号分隔

T: R + S

多重约束,T: R, S是错误的

T: ?Sized

Tb

T: 'a

T生命周期约束,需要长于a),示例

T: R + 'a

T必须实现trait``R,并且T生命周期需要长于a

'b: 'a

b生命周期需要长于a

S<T> where T: R

类似S<T: R>,较长的约束时更可读

S<T = R>

默认类型参数,关联类型

S<'_>

匿名生命周期推断,示例

S<_>

匿名类型推断

S::<T>

turbofish,为泛型中的方法指定具体参数

trait T<X> {}

trait泛型,类型参数X,可以多次实现T

trait T { type X; }

trait关联类型,无需标注类型,示例

type X = R;

设置关联类型,impl T for S { type X = R; }

impl<T> S<T> {}

为泛型T实现功能

impl S<T> {}

实现S<T>功能

fn f() -> impl T

"impl Trait"语法,返回trait``T示例

fn f(x: &impl T)

"impl Trait"语法约束,类似fn f<S:T>(x: &S)

fn f(x: &dyn T)

同上,但是动态分发

fn f() where Self: R

trait中,只有实现了R的类型可访问f

for<'a>

高阶trait限定

组织代码

将项目划分为更小的单元,并最小化依赖性。

示例

解释

mod m {}

定义模块m,在{}中定义内容,示例

mod m;

定义模块m,在m.rsm/mod.rs中定义内容

a::b

a中元素b的命名空间路径,示例

::b

root crate搜索b

crate::b

从当前crate搜索b

self::b

从当前模块搜索b

super::b

从父模块搜索b

use a::b;

use声明,导入b示例

use a::{b, c};

同上,多个

use a::b as x;

同上,将b命名为x

use a::b as _;

同上,匿名引入b示例

use a::*;

导入a中一切

pub use a::b;

重新导出a::b

pub T

将可见性修改为公开

pub(crate) T

在当前crate可见

pub(self) T

在当前模块可见

pub(super) T

在当前模块和父模块可见

pub(in a::b) T

a::b模块路径可见

extern crate a;

链接外部crate``a示例

extern "C" {}

用于FFI*链接外部库,比如"C",示例

extern "C" fn f() {}

定义函数暴露给FFI

FFI,Foreign Function Interface,外部语言函数接口

模式匹配与解构

matchlet表达式或函数参数中构造。

示例

解释

match m {}

模式匹配,示例

let S { x } = s;

let绑定模式匹配

let (_, b, _) = abc;

忽略部分

let (a, ..) = abc;

忽略其余

if let Some(x) = get() {}

get()匹配Some(x),则执行代码块,示例

fn f(S { x }: S)

函数参数,类似let

引用和指针

示例

解释

&S

引用,示例

&[S]

切片引用,包含地址和长度

&str

字符串引用

&dyn S

trait对象引用,包含地址和虚表,示例

&mut S

可变引用

*const S

裸指针,不可变的,示例

*mut S

同上,可变裸指针

&s

借用,不获取所有权

&mut s

可变借用

ref s

引用绑定,示例

*r

解引用,示例

*r = s;

如果r是可变引用,移动或复制s到目标内存

宏和属性

元编程,代码生成,语法扩展

示例

解释

m!()

宏调用,示例

#[attr]

属性用于模块或项,示例

#[attr = "value"]

属性形式1

#[attr(key = "value")]

属性形式2

#[attr(value)]

属性形式3

#![attr]

属性作用于整个crate

学习心得

  • 学习这种事,关键靠自己。被别人“喂”太多,不一定是好事。

  • 不要期望短期内一次性学会一门编程语言,尤其是Rust语言。

学习资源

知行之录公众号

Last updated

Was this helpful?