«заблокирован» для исключительного использования до тех пор, пока существует это закрытие. Средство проверки заимствования не пытается проверить сайты вызовов закрытия.

я есть следующий пример кода, который является стандартной основой управляемых событиями API в других языках программирования, но в Rust средство проверки заимствований блокирует его с помощью «не может заимствовать»p1 как изменяемые более одного раза за раз ":

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

Код можно использовать, например, для реализации двух обратных вызовов к окну: один для обработки событий клавиатуры, а другой для обработки событий мыши, которые обновляют состояние окна (например, изменение цвета, закрытие окна и т. Д.).

Я знаю, что этот вопрос появляется в других местах в Stack Overflow и других форумах, но в целом ответы сосредоточены на описании причины проблемы и редко предлагают полное общее решение для нее:

Нельзя заимствовать `x` как изменяемый более одного раза за разКак обойти «не может заимствовать как изменяемый более одного раза»?Не может быть заимствованным более одного раза за разПередача изменяемого контекста в обратные вызовыСоздание системы обратного вызова с использованием замыканийВыполнять обратные вызовы, такие как изменяемые заимствования из циклаОбратный звонок к изменчивому я

Ответы на вопрос(1)

Ваш ответ на вопрос