What does it mean for a trait to have a lifetime parameter?

前端 未结 1 1740
说谎
说谎 2020-12-19 13:50

I understand how lifetime parameters apply to functions and structs, but what does it mean for a trait to have a lifetime parameter? Is it a shortcut to in

相关标签:
1条回答
  • 2020-12-19 14:06

    If you have a trait with a lifetime bound, then implementors of the trait can participate in the same lifetime. Concretely, this allows you to store references with that lifetime. It is not a shortcut for specifying lifetimes on member methods, and difficulty and confusing error messages lie that way!

    trait Keeper<'a> {
        fn save(&mut self, v: &'a u8);
        fn restore(&self) -> &'a u8;
    }
    
    struct SimpleKeeper<'a> {
        val: &'a u8,
    }
    
    impl<'a> Keeper<'a> for SimpleKeeper<'a> {
        fn save(&mut self, v: &'a u8) {
            self.val = v
        }
        fn restore(&self) -> &'a u8 {
            self.val
        }
    }
    

    Note how both the struct and the trait are parameterized on a lifetime, and that lifetime is the same.

    What would the non-trait versions of save() and restore() look like for SimpleKeeper<'a>?

    Very similar, actually. The important part is that the struct stores the reference itself, so it needs to have a lifetime parameter for the values inside.

    struct SimpleKeeper<'a> {
        val: &'a u8,
    }
    
    impl<'a> SimpleKeeper<'a> {
        fn save(&mut self, v: &'a u8) {
            self.val = v
        }
        fn restore(&self) -> &'a u8 {
            self.val
        }
    }
    

    And would they mean exactly the same thing as the the trait version?

    Yep!

    0 讨论(0)
提交回复
热议问题