我最近一直在处理以下场景:
pub fn random_function(inp_array: &[u32]) {
for actual_val in (RefCell::new(*inp_array)).iter_mut() {
// change actual_val to e.g., constant number so that it's reflected in inp_array
}
给定一个将对不可变 u32 数组的引用作为输入的函数,我试图通过智能指针更改其内容。我对内部可变性概念还是有点陌生;上面的片段有以下问题:
error[E0277]: the size for values of type `[u32]` cannot be known at compilation time
error[E0599]: no method named `iter_mut` found for struct `RefCell` in the current scope
我不完全确定这里的正确模式是什么。有任何想法吗?谢谢!
这两个说法是不相容的。没有
unsafe
,你不能改变对不可变变量的引用。即便如此,它也是不健全的。
如果你的函数需要修改
inp_array
中的值,它必须把它当作一个&mut [u32]
.
你当然可以为此目的使用内部可变性,但是类型必须是
您不能更改共享引用背后的任何内容,除非它已经
在
&RefCell
中(例如通过
&Mutex
)。您最想要的版本是采用可变引用:Rc<RefCell>
如果你想使用内部可变性,你想改变的部分必须包装在一个已经支持它的结构中。所以你可以采取Arc<Mutex>
或
UnsafeCell