Trait 在Rust主要用于公共接口的定义,做为事物Behavior的抽象。
今天梳理下从最简单的trait到复杂的trait定义方式。
pub trait A {
fn hello_a(&self);
}
struct People;
impl A for People{
fn hello_a(&self) {
println!("Hello A");
}
}
pub trait B {
type Item;
fn hello_b(&self, item:Self::Item );
}
// 指定类型为String
impl B for People {
type Item = String;
fn hello_b(&self, item:Self::Item ) {
println!("Hello B {}", item);
}
}
类型关联与泛型接口很像,但使用类型关联,我们只需要实现想要的类型,后面使用就不像泛型接口,需要每次指定类型。
// 接口 C 依赖 A 和 B
pub trait C : A + B{
fn hello_c(&self);
}
impl A for People{
fn hello_a(&self) {
println!("Hello A");
}
}
impl B for People {
type Item = String;
fn hello_b(&self, item:Self::Item ) {
println!("Hello B {}", item);
}
}
// 如果A、B接口未对People实现,则编译出错
impl C for People {
fn hello_c(&self) {
println!("Hello C");
}
}
对于依赖其他trait的trait,相当于对行为加了约束,比如如果飞机要fly, 必须有run,先跑起来才有起飞。
// D 及依赖 A、B, 同时B的关联类型必须实现A的接口
pub trait D : A + B where <Self as B>::Item : A{
fn hello_d(&self);
}
impl A for People{
fn hello_a(&self) {
println!("Hello A");
}
}
impl B for People {
type Item = String;
fn hello_b(&self, item:Self::Item ) {
println!("Hello B {}", item);
}
}
impl D for People {
fn hello_d(&self) {
println!("Hello D");
}
}
// 为关联类型实现A接口
impl A for String {
fn hello_a(&self) {
}
}
fn main(){
let man = People;
man.hello_d();
}
上面的接口D 依赖A和B接口,同时需要B的关联类型需要实现A接口。 目前四类接口基本已经覆盖大部分使用。
泛型接口类似,后面需要分析时再补充完整。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。