У меня есть эта рабочая функция:
fn clear_job(state: State<MyState>) -> Option<String> {
let mut guard = state.job.lock().unwrap();
let maybe_job: &mut Option<Job> = &mut *guard;
// Job is not Copy nor Clone
match maybe_job {
None => None,
Some(job) => match job {
Job::InProgress { .. } => Some("Can't clear in progress job".into()),
_ => {
*maybe_job = None;
Some("Job cleared".into())
},
},
}
}
Я возвращаю None
, если у меня есть None
и Some
, если у меня есть Some
, что ... именно то, что Option::map()
есть!
Я пытался переписать эту функцию:
fn clear_job(state: State<MyState>) -> Option<String> {
let mut guard = state.job.lock().unwrap();
let maybe_job: &mut Option<Job> = &mut *guard;
maybe_job.as_ref().map(|job| match job {
Job::InProgress { .. } => "Can't clear in progress job".into(),
_ => {
*maybe_job = None;
"Job cleared".into()
},
})
}
Это дает мне эту ошибку:
error[E0500]: closure requires unique access to `maybe_job` but it is already borrowed
--> src/main.rs:113:28
|
113 | maybe_job.as_ref().map(|job| match job {
| --------- --- ^^^^^ closure construction occurs here
| | |
| | first borrow later used by call
| borrow occurs here
...
116 | *maybe_job = None;
| --------- second borrow occurs due to use of `maybe_job` in closure
Я вроде понимаю, почему есть ошибка; что я не понимаю, так это то, как я не получаю ошибку в версии match
, потому что семантически я делаю то же самое: читая в maybe_job
, получая заем на job
(так, предположительно на maybe_job
тоже), но все еще пишу в *maybe_job
.
Почему мне разрешено в первой версии, а не во второй? Есть ли способ использовать Option::map
в этой ситуации?