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