喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(=・ω・=)
题外话:trait的概念非常非常非常重要!!!整个第10章全都是Rust的重难点!!!
10.3.1. 什么是trait
trait意为特征、特质。trait用来向Rust编译器描述某种类型具有哪些并且可以与其它类型共享的功能。trait可以以抽象的方式来定义共享的行为。
与trait相关的还有trait bounds(约束)的概念,它可以将泛型类型参数指定为实现了特定行为的类型。换句话说就是要求泛型的类型参数实现了某些triat。
Rust里的trait与其他语言的接口(interface)有点类似,但还是有区别的。
10.3.2. 定义一个trait
类型的行为由该类型本身可调用的方法来组成。有时候在不同的类型上都具有相同的方法,这时候就称这些类型共享了相同的行为。trait提供了一种方式可以把一些方法放到一起,从而定义实现某种目的所必需的一种行为。
- 定义trait使用关键字
trait
,在trait的定义内只有方法签名,没有具体实现 - trait可以有多个方法,每个方法占一行,以
;
结尾 - 实现该trait的类型必须提供具体的方法实现,也就是必须有方法体
看个例子:
pub trait Summary {
fn summarize(&self) -> String;
}
trait
前面加上pub
代表公共的,这个trait的名字是Summary
,里面有一个方法的签名叫summerize
,除了&self
之外没有其他参数,返回类型是String
,然后加一个;
就结束了这个签名,它没有方法体,也就是没有具体的实现。当然一个trait
下可以有很多个方法签名:
pub trait Summary {
fn summarize(&self) -> String;
fn summarize1(&self) -> String;
fn summarize2(&self) -> String;
//......
}
10.3.3. 在类型上实现trait
在类型上实现trait与为类型实现方法很类似,但是也有不同之处。
为类型实现方法的写法是impl
关键字后面跟着类型就可以了:
impl Yyyy {
....}
而在类型上实现trait的写法是:
impl Xxxx for Yyyy {
....}
Xxxx
指的是trait的名Yyyy
指的是类型的名- 在花括号内需要对trait里的方法签名写下具体的实现
看个例子(lib.rs
):
pub trait Summary {