¿Cuál es la forma correcta de implementar el equivalente de múltiples devoluciones de llamada mutables (asignadas estáticamente, despachadas estáticamente, etc.) en Rust?

Tengo el siguiente código de ejemplo, que es la base estándar de las API controladas por eventos en otros lenguajes de programación, pero en Rust el verificador de préstamos lo bloquea con "no puedo tomar prestadop1 como mutable más de una vez a la vez ":

struct Pen {
    color_cmyk: u32,
    ink: usize,
}

impl Pen {
    pub fn new() -> Pen {
        Pen {
            color_cmyk: 0x80800000,
            ink: 20000,
        }
    }

    pub fn write(&mut self, text: &str) -> bool {
        if self.ink < text.len() {
            return false;
        }

        self.ink -= text.len();
        true
    }
}

fn main() {
    println!("Hello, world !");

    let mut p1 = Pen::new();
    p1.write("Hello");
    println!("ink: {}, color: {}", p1.ink, p1.color_cmyk);

    let mut cb = |text| if p1.write(text) {
        println!("{}", text);
    } else {
        println!("Out of ink !");
    };

    let mut cb2 = |text| {
        p1.write(text);
        p1.ink
    };

    cb("Hello");
    cb("World");
    println!("{}", cb2("Hello"));
}
error[E0499]: cannot borrow `p1` as mutable more than once at a time
  --> src/main.rs:37:23
   |
31 |         let mut cb = |text| if p1.write(text) {
   |                      ------    -- previous borrow occurs due to use of `p1` in closure
   |                      |
   |                      first mutable borrow occurs here
...
37 |         let mut cb2 = |text| {
   |                       ^^^^^^ second mutable borrow occurs here
38 |             p1.write(text);
   |             -- borrow occurs due to use of `p1` in closure
...
45 |     }
   |     - first borrow ends here

El código se puede usar, por ejemplo, para implementar dos devoluciones de llamada a una ventana: una para manejar eventos de teclado y otra para manejar eventos de mouse, los cuales actualizan el estado de la ventana (por ejemplo, cambiar el color, cerrar la ventana, etc.).

Sé que esta pregunta aparece en otra parte de Stack Overflow y otros foros, pero en general, las respuestas se centran en describir la razón del problema y rara vez proponen una solución general completa para ello:

No se puede pedir prestada `x` como mutable más de una vez a la vez¿Cómo evitar "no se puede pedir prestado como mutable más de una vez"?No puede tomar prestado como mutable más de una vez a la vezPasar contexto mutable a devoluciones de llamadaCrear un sistema de devolución de llamada utilizando cierresEjecute devoluciones de llamada como préstamos mutables del cicloDevolución de llamada a uno mismo mutable

Respuestas a la pregunta(1)

Su respuesta a la pregunta