rust lifetime problem, why the first call not compile error?

Viewed 64
#[derive(Debug)]
struct NumRef<'a>(&'a i32);

impl<'a> NumRef<'a> {
    // my struct is generic over 'a so that means I need to annotate
    // my self parameters with 'a too, right? (answer: no, not right)
    fn some_method(&'a mut self) {}
}

fn main() {
    let mut num_ref = NumRef(&5);
    num_ref.some_method(); // mutably borrows num_ref for the rest of its lifetime
    num_ref.some_method(); // compile error
    println!("{:?}", num_ref); // also compile error
}

'a is should be 'static, num_ref's lifetime is shorter then 'static

1 Answers

The problem is that you've told Rust that some_method needs self for 'a.

But by definition 'a lives for longer than the instance of NumRef.

This means the only way to fulfill your requirement is to create a borrow which lasts for the entire lifetime of the instance, aka as soon as the method is called you're completely locked out.

You can just remove the lifetime bound from the self entirely:

impl<'a> NumRef<'a> {
    fn some_method(&mut self) {}
}

These lifetimes are essentially unrelated: here some_method cares about NumRef, not 'a.

Related