Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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 introduce a lifetime parameter to its methods, or is it something else?

like image 983
goertzenator Avatar asked Apr 30 '15 19:04

goertzenator


People also ask

What is the lifetime of a parameter?

... "the lifetime of a parameter ends when the function in which it is defined returns ", the suspend indeed returns to the caller as per control flow returns to the current coroutine caller or resumer.

What is a named lifetime parameter in Rust?

Introducing lifetimes Lifetimes are what the Rust compiler uses to keep track of how long references are valid for. Checking references is one of the borrow checker's main responsibilities. Lifetimes help the borrow checker ensure that you never have invalid references.

What does static lifetime mean Rust?

Static items have the static lifetime, which outlives all other lifetimes in a Rust program. Static items may be placed in read-only memory if the type is not interior mutable. Static items do not call drop at the end of the program.

What is Anonymous lifetime?

'_ , the anonymous lifetime Rust 2018 allows you to explicitly mark where a lifetime is elided, for types where this elision might otherwise be unclear.


1 Answers

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!

like image 110
Shepmaster Avatar answered Sep 28 '22 00:09

Shepmaster