I’ve been trying to use OneCell, but I keep having errors trying to set it up to handle a mutable vector that I can push to.
I know there’s going to be some answers telling me maybe not to use a singleton, but the alternative of passing a vector all around throughout my code is not ergonmic at all.
I’ve tried lots of things, but this is where I’m at right now. Specifically I’m just having trouble initializing it.
`/**
- LOG_CELL
- Stores a vec of Strings that is added to throughout the algorithm with information to report
- To the end user and developer */ pub static LOG_CELL: OnceLock<&mut Vec> = OnceLock::new();
pub fn set_log() { LOG_CELL.set(Vec::new()); }
pub fn push_log(message: String) { if let Some(vec_of_messages) = LOG_CELL.get() { let something = *vec_of_messages; something.push(message); } } `
You can wrap the Vec in a Mutex
OnceLock is the wrong primitive for this. Use a Mutex or an RwLock instead? You can initialize either of them with an empty array at declaration, so you don’t need the set_log function. In push_log, do a
.lock().unwrap()
for a mutex or.write().unwrap()
for an rwlock to get mutable access to the vector.Nice, thanks… looking into these now.
Can’t you just use the
get_or_init
method instead ofget
inside thepush_log
method? This would initialize the cell on first use. You’d still need a Mutex inside of it to acquire a mutable reference to the vector.