繁体   English   中英

多次从Option <&mut T>中读取引用

[英]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不必是可变的,因为我没有对其进行修改(请参见上文)。

什么是正确的解决方案?

编辑1

我的问题与如何将`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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM