Почему я получаю двойной изменяемый заем, если исключаю время жизни возвращаемого значения? - PullRequest
0 голосов
/ 19 марта 2020

Я хочу реализовать симулятор ОС с таким дизайном:

  • Структура ОС, содержащая список процессов
  • Каждый процесс имеет приоритет и является закрытием, которое запускается при получении Сама ОС как параметр
  • ОС извлекает процессы и запускает их

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

Я получаю следующую ошибку:

error[E0500]: closure requires unique access to `self` but it is already borrowed
  --> src/lib.rs:66:21
   |
65 |         let process = self.processes.pop();
   |                       -------------- borrow occurs here
66 |         process.map(|p| p.exec(self));
   |                 --- ^^^        ---- second borrow occurs due to use of `self` in closure
   |                 |   |
   |                 |   closure construction occurs here
   |                 first borrow later used by call

Я обнаружил ошибку, и она связана со структурой OS:

struct OS<'a> {
    processes: ProcessList<'a>,
}

Если я изменю это на:

struct OS<'a> {
    processes: BinaryHeap<Process<'a>>,
}

Et voilà , он скомпилируется.

ProcessList - это просто контейнер для BinaryHeap. Я подозревал, что это было связано с тем, что ProcessList имеет время жизни в определении структуры, и снова у нас есть виновник:

impl<'a> ProcessList<'a> {
    fn pop(&mut self) -> Option<Process> {
        self.list.pop()
    }
}

Если я изменю это, чтобы явно вернуть Process с ProcessList параметр жизни ...

impl<'a> ProcessList<'a> {
    fn pop(&mut self) -> Option<Process<'a>> {
        self.list.pop()
    }
}

... у нас снова есть рабочая программа.

Согласно правилам выбора времени жизни, возвращаемое мной Process должно иметь то же время жизни как self, которое, как я думал, было тем же временем жизни самой конструкции.

Что я здесь упускаю?

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