美文网首页
rust--什么是trait bound?

rust--什么是trait bound?

作者: 极光火狐狸 | 来源:发表于2018-09-03 13:36 被阅读30次
// 什么是trait bound ?


// 默认情况下, 泛型是表示所有类型, 泛型绑定指的是: 限定泛型类型的范围.
// 泛型绑定有两种写法.


fn example1() {
    // 第一种写法是再T后面指定限制trait.
    // T: Fn(u32) -> u32 表示指定这个泛型只接受匿名函数trait.
    struct Cacher<T: Fn(u32) -> u32> {
        calculation: T,
        value: Option<u32>,
    }

    // 这里只要impl后面写一次绑定, 后面则不需要再重复写.
    impl<T: Fn(u32) -> u32> Cacher<T> {
        fn new(calculation: T) -> Cacher<T> {
            Cacher {
                calculation,
                value: None,
            }
        }

        fn value(&mut self, arg: u32) -> u32 {
            match self.value {
                Some(v) => v,
                None => {
                    let v = (self.calculation)(arg);
                    self.value = Some(v);
                    v
                },
            }
        }
    }

    let mut cacher = Cacher::new(|x| x+1);
    println!("{}", cacher.value(10));
    println!("{}", cacher.value(15));
}


fn example2() {
    // 第而种写法是使用where关键字.
    struct Cacher<T>
        where T: Fn(u32) -> u32,
    {
        calculation: T,
        value: Option<u32>,
    }

    impl<T> Cacher<T>
        where T: Fn(u32) -> u32,
    {
        fn new(calculation: T) -> Cacher<T> {
            Cacher {
                calculation,
                value: None,
            }
        }

        fn value(&mut self, arg: u32) -> u32 {
            match self.value {
                Some(v) => v,
                None => {
                    let v = (self.calculation)(arg);
                    self.value = Some(v);
                    v
                },
            }
        }
    }

    let mut cacher = Cacher::new(|x| x+1);
    println!("{}", cacher.value(20));
    println!("{}", cacher.value(25));
}



fn main() {
    example1();
    example2();
}

相关文章

网友评论

      本文标题:rust--什么是trait bound?

      本文链接:https://www.haomeiwen.com/subject/ihbbwftx.html