How can I reassign two variables when one has a reference to the other?

Here's a playground link: Rust Playground

struct A(i32);
struct B<'x>(&'x A);
impl Drop for B<'_> {
    fn drop(&mut self) { }

pub fn main() {
    let mut a = A(0);
    let mut b = B(&a);
    println!("{}", b.0.0);

    a = A(1);
    b = B(&a);
    println!("{}", b.0.0)

This program doesn't compile because a is borrowed by b and cannot be reassigned. The borrow will end when b is reassigned, but that's too late. What's a good way to change both a and b at the same time?

If you really must have these two mutable variables, then you need to manually drop b before re-assigning a.

1 Like

Thanks, that should do it. I didn't realise the inferred lifetime was excessive and I could just shorten it.

The lifetime wasn't excessive -- it had to be alive during the drop of the original b value when you assign a new value. It's a use of the lifetime, if you will. By changing the drop location, you change where the lifetime has to be alive.

This topic was automatically closed 90 days after the last reply. We invite you to open a new topic if you have further questions or comments.