rust--trait继承另外一个trait

2018-08-31  本文已影响61人  极光火狐狸
fn main() {

    use std::fmt;

    #[allow(dead_code)]
    struct Point {
        x: i32,
        y: i32,
    }

    // OutlinePrint 这个trait 继承fmt::Display, 
    // 并提供一个额外的 outline_print 功能.
    trait OutlinePrint: fmt::Display {
        // outline_print是一个默认实现功能函数.
        // 利用self数据进行二次加工.
        fn outline_print(&self) {
            let output = self.to_string();
            let len = output.len();
            println!("{}", "*".repeat(len + 4));
            println!("*{}*", " ".repeat(len + 2));
            println!("* {} *", output);
            println!("*{}*", " ".repeat(len + 2));
            println!("{}", "*".repeat(len + 4));
        }
    }

    // 由于OutlinePrint已经默认实现了outline_print功能, 
    // 因此这里只要声明一下Point拥有这个trait即可.
    impl OutlinePrint for Point {}
    
    // 这里仍然需要声明Point拥有fmt::Display, 这是因为Rust的语法要求.
    impl fmt::Display for Point {
        
        // 为什么这里要写这个方法?
        // 那是因为fmt::Display只是定义了一个接口, 并没有实现这个方法.
        fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
            write!(f, "({}, {})", self.x, self.y)
        }
    }

    // 通过三面这几种定义、组合、声明, 最终完成了打印效果改装.
    let p = Point {x: 1, y: 2};
    p.outline_print();

    // output:
    // **********
    // *        *
    // * (1, 2) *
    // *        *
    // **********
}
上一篇 下一篇

猜你喜欢

热点阅读