Как я могу использовать замыкание, которое изменчиво захватило переменную в цикле, который проверяет то же значение? - PullRequest
0 голосов
/ 30 мая 2018
fn main() {
    let mut foo = 1;

    let mut func = || foo += 1;
    while foo < 5 {
        func();
    }
}
error[E0503]: cannot use `foo` because it was mutably borrowed
 --> src/main.rs:5:11
  |
4 |     let mut func = || foo += 1;
  |                    -- borrow of `foo` occurs here
5 |     while foo < 5 {
  |           ^^^ use of borrowed `foo`

Я понимаю, почему это не работает, но я ищу способ как-то обойти проверку заимствований.Есть ли способ использовать закрытие здесь?Есть ли хорошая альтернатива помимо использования функции?У меня есть ситуация, когда я должен изменить несколько переменных.

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Нет , вы не можете этого сделать.В то время как замыкание имеет изменяемый заем, ничто другое не может получить доступ к этой переменной.

Вместо ...

Изменения псевдонимов во время выполнения XOR

Вы можете использовать Cell илиa RefCell:

use std::cell::Cell;

fn main() {
    let foo = Cell::new(1);

    let func = || foo.set(foo.get() + 1);

    while foo.get() < 5 {
        func();
    }
}

См. также:

Пусть закрытие обрабатывает все

Вы можете запечь сравнение в замыкании:

fn main() {
    let mut foo = 1;

    let mut func = || {
        foo += 1;
        foo < 5
    };

    while func() {}
}

Использовать структуру

struct Thing(i32);

impl Thing {
    fn do_it(&mut self) {
        self.0 += 1
    }

    fn test_it(&self) -> bool {
        self.0 < 5
    }
}

fn main() {
    let mut foo = Thing(1);

    while foo.test_it() {
        foo.do_it();
    }
}
0 голосов
/ 30 мая 2018

Один из возможных вариантов - передать изменяемую ссылку на замыкание, а не косвенно заимствовать его при захвате среды:

fn main() {
    let mut foo = 1;

    let func = |foo: &mut i32| *foo += 1;

    while foo < 5 {
       func(&mut foo);
    }
}

детская площадка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...