Я хочу реализовать симулятор ОС с таким дизайном:
- Структура ОС, содержащая список процессов
- Каждый процесс имеет приоритет и является закрытием, которое запускается при получении Сама ОС как параметр
- ОС извлекает процессы и запускает их
Это простой дизайн для создания минимального рабочего примера, который вы можете увидеть на игровой площадке .
Я получаю следующую ошибку:
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
, которое, как я думал, было тем же временем жизни самой конструкции.
Что я здесь упускаю?