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?