我有一个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;
}
}
mut a
是必需的,否则我会得到一个错误"不能将不可变的匿名字段(a:std::prelude::v1::Some).0
borrow 为可变的".但这感觉不对:a
不应该是可变的,因为我没有修改它(见上文).
正确的解决方案是什么?
编辑1
我的问题不同于百分之一百的问题.我希望在Option<&mut T>
中多次可变地取消引用,而另一个希望将Option
传递给多个函数调用.另一个问题的解决方案不适用于我的情况.