No se puede tomar prestado como inmutable porque también se toma prestado como mutable en los argumentos de función

Que esta pasando aqui (patio de recreo)?

struct Number {
    num: i32
}

impl Number {
    fn set(&mut self, new_num: i32) {
        self.num = new_num;
    }
    fn get(&self) -> i32 {
        self.num
    }
}

fn main() {
    let mut n = Number{ num: 0 };
    n.set(n.get() + 1);
}

Da este error:

error[E0502]: cannot borrow `n` as immutable because it is also borrowed as mutable
  --> <anon>:17:11
   |
17 |     n.set(n.get() + 1);
   |     -     ^          - mutable borrow ends here
   |     |     |
   |     |     immutable bor,row occurs here
   |     mutable borrow occurs here

Sin embargo, si simplemente cambia el código a esto, funciona:

fn main() {
    let mut n = Number{ num: 0 };
    let tmp = n.get() + 1;
    n.set(tmp);
}

Para mí, esos se ven exactamente equivalentes, es decir, esperaría que el primero se transformara en el segundo durante la compilación. ¿Rust no evalúa todos los parámetros de la función antes de evaluar la llamada a la función de nivel superior?

Respuestas a la pregunta(1)

Su respuesta a la pregunta