I want to write some code for my project. How can I dereference an Option<Arc<T>>
correctly?
I have tried:
use std::io::Read;
use std::sync::Arc;
struct Map<T: Read> {
shared_reader: Option<Arc<T>>,
}
impl<T: Read> Default for Map<T> {
fn default() -> Self {
Self {
shared_reader: None,
}
}
}
impl<T: Read> Map<T> {
fn read_raw_data(&mut self) -> Option<Vec<u8>> {
if let Some(srd) = &mut self.shared_reader {
/*I think the srd should have a type &mut Arc<T>*/
let mut buf = Vec::with_capacity(4096);
if let Ok(_) = srd.read_to_end(&mut buf) {
return Some(buf);
} else {
return None;
}
} else {
return None;
}
}
}
When I compile this, I get an error:
error[E0596]: cannot borrow data in a `&` reference as mutable
--> src/lib.rs:21:28
|
21 | if let Ok(_) = srd.read_to_end(&mut buf) {
| ^^^ cannot borrow as mutable
There is the solution
use std::borrow::BorrowMut;
use std::io::Read;
use std::sync::{Arc, Mutex};
struct Map<T: Read> {
shared_reader: Option<Arc<Mutex<T>>>,
}
impl<T: Read> Default for Map<T> {
fn default() -> Self {
Self {
shared_reader: None,
}
}
}
impl<T: Read> Map<T> {
fn read_raw_data(&mut self) -> Option<Vec<u8>> {
if let Some(srd_lock) = &self.shared_reader {
if let Ok(srd) = &mut srd_lock.lock() {
let mut buf = Vec::with_capacity(4096);
if let Ok(_) = srd.read_to_end(&mut buf) {
return Some(buf);
} else {
return None;
}
} else {
return None;
}
} else {
return None;
}
}
}