作为类型

Rust 中 trait 本身可以作为类型,用来描述变量的类型,这里的变量就包含的函数、方法的入口参数和返回值的类型。

trait Opts1 {
    fn pair(&self) -> i32;
    fn falf(&self) -> i32;
}

trait Opts2 {
    fn triple(&self) -> i32;
}

impl Opts1 for i32 {
    fn pair(&self) -> i32 {
        self * 2
    }

    fn falf(&self) -> i32 {
        self / 2
    }
}

impl Opts2 for i32 {
    fn triple(&self) -> i32 {
        self * 3
    }
}

fn do_pair(a: impl Opts1) -> impl Opts1{
    let a = a.pair();
    a
}

fn do_falf(a: impl Opts1) -> impl Opts1{
    let a = a.falf();
    a
}

fn do_triple(a: impl Opts1 + Opts2) -> i32 {
    let a = a.pair().falf();
    a.triple()
}

fn main() {
    let a: i32 = 3;

    do_pair(do_falf(a));
    println!("triple of a: {}", do_triple(a));
}

这里不仅体现了 trait 可以作为类型来描述入口参数和返回值,还体现了 Rust 一个强大的特性,类型可以用运算符的形式来更加精确的描述。

用实际行动来体现 组合大于继承 的设计原则