进行多次可变借贷

时间:2018-10-20 20:00:45

标签: rust mutable 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);

}

为什么此代码编译时没有错误?毕竟,我在foo上获得了多个可变引用。将以下内容写入文档:

参考规则
让我们回顾一下我们对参考文献的讨论:

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

b)引用必须始终有效。

此行为的原因是什么?谢谢!

2 个答案:

答案 0 :(得分:6)

使用2018年版时,您可能会受益于enabled by default since Rust 1.30的非词汇生存期。

另请参阅What are non-lexical lifetimes?

答案 1 :(得分:1)

在rust版本(1.29.1)上,我确实有多重借阅错误。

我认为您在这里受益于非词法生存期,否则编译器将智能地**代码优化为:

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

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

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

之所以有效,是因为您没有使用xy

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