Rust Mou одолжить неудачу в закрытии - PullRequest
0 голосов
/ 10 марта 2019

Вот мой код

struct test_loop {
    is_break: bool,
}
impl test_loop {
    fn run_forever<F>(&mut self, mut f: F)
    where
        F: FnMut() -> (),
    {
        self.is_break = false;
        loop {
            f();
            if self.is_break {
                break;
            }
        }
    }
    fn breakit(&mut self) {
        self.is_break = true;
    }
}
fn main() {
    let mut l = test_loop { is_break: false };
    let f = || {
        l.breakit();
    };
    l.run_forever(f);
}

Код прост, и я не хочу пропустить вызов l.breakit() в закрытии.Теперь компилятор сообщает мне, что существует вторая проблема с изменяемым заимствованием:

error[E0499]: cannot borrow `l` as mutable more than once at a time
  --> src/main.rs:26:5
   |
23 |     let f = || {
   |             -- first mutable borrow occurs here
24 |         l.breakit();
   |         - first borrow occurs due to use of `l` in closure
25 |     };
26 |     l.run_forever(f);
   |     ^             - first borrow later used here
   |     |
   |     second mutable borrow occurs here

Я использовал RefCell, чтобы решить проблему компиляции, но поток все еще паникует во время выполнения.Должен ли я удалить l.xxx в закрытии?Или есть какой-то способ заставить код работать так, как будто он работает на C ++ или другом языке?

1 Ответ

1 голос
/ 10 марта 2019

, если f() может изменить состояние test_loop, то естественно добавить эту ссылку в свою подпись. Это решает вторую проблему заимствования.

fn run_forever<F>(&mut self, mut f: F)
where
    F: FnMut(&mut Self) -> (), 
{ 
    // call f(self) instead of f()
}

// main
let f = |l: &mut test_loop| {
    l.breakit();
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...