rust 无法获取对基础OnceLock数据的可变引用

vc9ivgsu  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(179)

我尝试使用get_mut()方法获取对OnceLock底层数据的可变引用,但出现错误

mod OL {
    use std::sync::OnceLock;
    
    static CELL: OnceLock<i32> = OnceLock::new();
    
    pub fn set_cell_val(val: i32) {
        CELL.set(val);
    }
    
    pub fn get_mut_ref() -> &'static mut i32 {
        CELL.get_mut().unwrap()
    }
}

fn main() {
    println!("Hello, world!");
}

字符串
错误类型

error[E0596]: cannot borrow immutable static item `CELL` as mutable
  --> src/main.rs:11:9
   |
11 |         CELL.get_mut().unwrap()
   |         ^^^^^^^^^^^^^^ cannot borrow as mutable

For more information about this error, try `rustc --explain E0596`.

au9on6nz

au9on6nz1#

OnceLock是分配 * 一次 * 的单元。根据定义,在被分配之后,它不能再改变。
get_mut()确实存在,但它服务于利基用例,绝对不是你的用例。OnceLock不适合你。
您需要的是MutexRwLock。它们可以多次更改:

use std::sync::{Mutex, MutexGuard};

static VALUE: Mutex<i32> = Mutex::new(0);

pub fn set_value(val: i32) {
    *value.lock().unwrap() = val;
}

// This is not a mutable reference, but it acts like one (e.g. it can be assigned into).
pub fn get_mut_ref() -> MutexGuard<'static, i32> {
    VALUE.lock().unwrap()
}

字符串
如果你想要一个变化的值,也是惰性初始化的,你可以使用OnceLock<Mutex>

相关问题