rust 尝试获取单元格内部的值时,无法移出可变引用

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

我试图获取Cell内部的值,但我只将get_mut作为一个方法获取,并收到下面的错误。

error[E0596]: cannot borrow `*data` as mutable, as it is behind a `&` reference
  --> src\stack.rs:17:28
   |
17 |         file_dir.push_str(&data.get_mut().unwrap());
   |                            ^^^^^^^^^^^^^^ `data` is a `&` reference, so the data it refers to cannot be borrowed as mutable
   |
help: consider changing this to be a mutable reference
   |
16 |     PANIC_ERROR_OUTPUT.with(|data: &mut Cell<Option<String>>| {
   |                                     +++

字符串
data更改为可变引用只会抛出另一个错误,说明预期的类型和给定的类型不匹配。我也试过解引用和克隆,但没有成功。
完整的片段是:

use std::cell::Cell;

thread_local! {
  pub static PANIC_ERROR_OUTPUT: Cell<Option<String>> = Cell::new(None);
}

pub fn set_error_file_dir(dir: &str) {
    PANIC_ERROR_OUTPUT.with(|data| {
        data.set(Some(dir.to_string()));
    });
}

pub fn get_error_file_directory() -> String {
    let mut file_dir = String::new();

    PANIC_ERROR_OUTPUT.with(|data: &Cell<Option<String>>| {
        file_dir.push_str(&data.get_mut().unwrap());
    });

    return file_dir;
}


这个错误似乎与我以前遇到的另一个错误Cannot return value referencing local variable, data owned by current function, for struct method相似

fzsnzjdm

fzsnzjdm1#

std::cell::Cell不是这样工作的。它几乎只对Copy数据有用。它的方法get require T: Copy和描述说
返回所包含值的副本。
Cell通过返回所包含值的副本来实现interior mutability,由于它从不产生对它所包含数据的引用(get_mut除外,但正如文档所述,这只在您已经拥有对Cell本身的可变引用时才有用),因此您不能违反引用别名规则。
由于您要存储的是String,而不是Copy,因此不能使用Cell来执行此操作。如果你只想初始化你的数据一次(这可能是因为你使用的是一个本地线程,并将String存储在一个Option中),你应该看看OnceCell,它应该给予你你正在寻找的API。但是,如果你想多次写入单元格,你可能应该使用RefCell甚至Mutex,这取决于你的需求。

相关问题