我有一个Option<&mut T>
并且想要多次访问包含的引用,如下所示:
fn f(a: Option<&mut i32>) {
if let Some(x) = a {
*x = 6;
}
// ...
if let Some(x) = a {
*x = 7;
}
}
fn main() {
let mut x = 5;
f(Some(&mut x));
}
那是行不通的,因为if let Some(x) = a
将参考值移出选项,第二个if let Some(x) = a
将导致编译器错误。没有第二个if let ...
,这可以完美地工作,所以a
不一定是可变的。
下列:
if let Some(ref x) = a {
**x = 6;
}
给出错误:“分配给不可变引用”。
这会起作用:
fn f(mut a: Option<&mut i32>) {
if let Some(ref mut x) = a {
**x = 6;
}
if let Some(ref mut x) = a {
**x = 7;
}
}
The mut a
是必要的,否则我会收到错误“无法借用不可变的匿名字段”(a:std::prelude::v1::Some).0
是可变的”。但这感觉不对:a
不应该是可变的,因为我没有修改它(见上文)。
正确的解决办法是什么?
Edit 1
我的问题与其中的问题不同如何将 `Option` 传递给多个函数调用而不导致移动错误? https://stackoverflow.com/questions/40658487/how-to-pass-optionmut-to-multiple-function-calls-without-causing-move-e。我想可变地取消引用中的引用Option<&mut T>
多次,而另一个想要通过Option
到多个函数调用。其他问题的解决方案不适用于我的情况。
那这个呢?
fn f(a: Option<&mut i32>) {
if let Some(&mut ref mut x) = a {
*x = 6;
}
// ...
if let Some(&mut ref mut x) = a {
*x = 7;
}
}
在这种情况下,a
不需要是可变的。
The &mut ref mut
感觉有点尴尬,但这是有道理的:首先我们删除一个&mut
通过解构,然后再次获取对该值的可变引用。当我们不使用时更明显Option
:
let mr: &mut Vec<u32> = &mut vec![];
{
let &mut ref mut a = mr;
a.push(3);
}
mr.push(4);
这也有效。第三行(特殊)相当于:
let a = &mut *mr ;
// ^^^----- this is an lvalue of type `Vec<u32>`
// ^^^^^^^^^^^^----- together it's of type `&mut Vec<u32>` again
In the Option
这种情况下,我们不能使用&mut *X
版本,但需要在模式内完成所有操作。就这样&mut ref mut x
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)