OOP

结构体

struct User {
    username: String,
    email: String,
    sign_in_count: u64,
    active: bool,
}

定义一个结构体实例(rust只允许整体可变或不可变):

let user1 = User {
    email: String::from("someone@example.com"),
    username: String::from("someusername123"),
    active: true,
    sign_in_count: 1,
}; // immutable
let mut user1 = User {
    email: String::from("someone@example.com"),
    username: String::from("someusername123"),
    active: true,
    sign_in_count: 1,
}; // mutable

当使用某个变量初始化结构体的某个域,且这个变量的名字和这个域的名字一样时,初始化可以省略域的名字:

从已有的一个结构体创建新结构体,可以使用如下的update语法:

可以创建域操作类似于tuple的tuple struct(相当于一个定义了类名的tuple):

结构体允许被定义为不含任何域。

结构体可以包含类型为引用的域,但需要借助lifetime机制。

可以使用println!打印结构体,但需要使用{:?}或者{:#?}格式化,并在结构体定义前面添加一行#[derive(Debug)].

方法

关键字为impl

方法的第一个参数一定是self,它可以让出所有权、给出可变引用或不可变引用(self,&self,&mut self

如果不带上self参数就是关联函数(associated function),类似于C的静态函数:

调用时用双冒号,如Rectangle::square(3).

同一个类的方法可以定义在多个impl块里。

enum枚举

最简单的形式:

使用IpAddrKind::V4取值。

枚举变量可以被定义为和某类数据具有绑定关系:

甚至枚举类型也可以定义方法,如对上面的Message:

Option

特殊且常用的模板类:

编译器不会把Option类型自动转换为T类型。

枚举类需要使用match语法来处理。

match,pattern & if let

一个match表达式实例:

为了提取枚举表达式中的数据,需要用到pattern语法:

利用match和pattern可以完成对Option的处理:

match语句中可以使用_作为一个default分支:

上面的语句也可以用如下的if let代替:

if let有一个备选的else分支:

modules封装

  • Packages: A Cargo feature that lets you build, test, and share crates

  • Crates: A tree of modules that produces a library or executable

  • Modules and use: Let you control the organization, scope, and privacy of paths

  • Paths: A way of naming an item, such as a struct, function, or module

容器

Vector

异常处理

expect

assert断言

Last updated

Was this helpful?