[英]Read reference from Option<&mut T> multiple times
我有一个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
将参考值移出Option,那么第二个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;
}
}
mut a
是必需的,否则会出现错误“无法借用可变的匿名字段(a:std::prelude::v1::Some).0
为可变”。 但这感觉不对: a
不必是可变的,因为我没有对其进行修改(请参见上文)。
什么是正确的解决方案?
我的问题与如何将`Option <&mut ...>`传递给多个函数调用而不引起移动错误的问题不同? 。 我想多次可变地取消引用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
不需要是可变的。
&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
在Option
情况下,我们不能使用&mut *X
版本,但需要在模式内部进行所有操作。 因此, &mut ref mut x
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.