我有一个 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
不应该是可变的,因为我没有修改它(参见上文)。正确的解决方案是什么?
编辑1
我的问题与如何在不引起移动错误的情况下传递`Option<&mut ...>`到多个函数调用中? 不同。 我想多次可变地取消引用
Option<&mut T>
中的引用,而另一个问题则想将Option
传递给多个函数调用。 另一个问题的解决方案不适用于我的情况。
let tmp = &mut a; if let &mut Some(ref mut x) = tmp { ...
?但是这样a
必须是可变的,而我想要避免这种情况。 - Adrian Willenbüchera
必须是mut
,那有什么问题吗?你函数外的任何人都不关心(或者不能关心)这个参数是否是mut
。你拥有它,所以你可以随心所欲地使用它。如果你真的很在意,你也可以这样做:let mut tmp1 = a; let mut tmp2 = &mut tmp1;
。 - Shepmaster