多次可变引用出错的例子

问题描述

问题来自于Rust社区,地址:https://users.rust-lang.org/t/returning-mu..., 是一个发生多次借用的错误,错误代码如下:

fn main() {
    println!("Hello, world!");
    let mut foo = Foo { bar: &"dood" };
    let mut b = Baz { foo: None };
    assign_hold(&mut foo, &mut b);
}

struct Foo<'a> {
    bar: &'a str
}

struct Baz<'a, 'b> {
    foo: Option<&'a mut Foo<'b>>
}

fn produce_mut_ref<'a, 'b>(x: &'a mut Foo<'b>) -> &'a mut Foo<'b> where 'b: 'a{
    return x;
}

fn assign_hold<'a, 'b>(f: &'a mut Foo<'a>, b: &'a mut Baz<'a, 'a>){
    let mut x = 0;
    loop {        
        b.foo = Some(produce_mut_ref(f)); //错误代码
        b.foo = None; 
        x+=1;
        if x > 5 {       
            break;
        }
    }   
}

原因分析

在Rust中,不能在拥有不可变引用的同时拥有可变引用,因为不可变引用的用户可不希望在他们的眼皮底下值就被意外的改变了!也不能同时拥有多个可变引用,因为这可能引起数据竞争。多个不可变引用是可以的,因为没有哪个只能读取数据的人有能力影响其他人读取到的数据。
在上述的代码中,在循环中调用produce_mut_ref(f),是对f的可变引用,多次可变引用,在Rust中是不允许的,因此编译报错。

令狐一冲
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!