Rust多次可变借用

Sar*_*gis 3 mutable rust borrowing

我正在尝试Rust并且在理解"借用"方面存在问题.

struct Foo<T> {
    data: T,
}

impl<T> Foo<T> {
    fn new(data: T) -> Self {
        Foo {
            data: data,
        }
    }
}

fn main() {
    let mut foo = Foo::new("hello");

    let x = &mut foo;
    let y = &mut foo;

    println!("{}", foo.data);

}
Run Code Online (Sandbox Code Playgroud)

为什么这段代码编译没有错误?毕竟,我得到了多个可变引用foo.以下内容写入文档:

参考规则
让我们回顾一下我们讨论的关于参考文献的内容:

a)在任何给定时间,您可以拥有(但不是两个)一个可变引用或任意数量的不可变引用.

b)参考文献必须始终有效.

这种行为的原因是什么?谢谢!

mca*_*ton 9

你可能从非词法生命期中受益,这些生命周期自Rust 1.30使用2018版以来默认启用.

另请参见什么是非词汇生命周期?.


Gui*_*ard 5

在我的 Rust 版本(1.29.1)上,我确实遇到了多重借用错误。

我认为您在这里受益于非词法生命周期,或者编译器巧妙地优化*代码为:

let mut foo = Foo::new("hello");

{ let x = &mut foo; }
{ let y = &mut foo; }

println!("{}", foo.data);
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为你没有使用xand y

*:来自 @mcarton:优化发生在借用检查通过之后,因此唯一的选择是 NLL。