Rust多重可变借用问题

9

我正在尝试Rust编程语言,但在理解"borrowing"(借用)方面遇到了问题。

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) 引用必须始终有效。
为什么会出现这种行为?谢谢!

"为什么这段代码可以编译通过?" -- 不是吗? - Benjamin Lindley
是的,我刚刚发布了一个答案,现在才注意到你说它可以编译。你确定吗? - kabanus
2
是的,它可以编译。 - Sargis
无法在稳定版或夜间版中复现,无论是否进行了优化。 - Benjamin Lindley
1
可能是非词法生命周期是什么?的重复问题。 - Stargateur
2个回答

12

5
在我的Rust版本(1.29.1)上,我确实有多重借用的错误。
我认为你在这里受益于非词法生命周期(non-lexical lifetimes),或者编译器明智地将代码进行了优化*.
let mut foo = Foo::new("hello");

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

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

这个方法之所以有效,是因为你没有使用xy

*:来自@mcarton的说法:优化发生在借用检查后,所以唯一的选择是NLL。


我使用 Rust 的夜版。可能是因为这个原因。 - Sargis
谢谢你的回答。当我添加 println!("{}", x.data); 和 println!("{}", y.data); 时,它无法编译。对我的糟糕英语感到抱歉... - Sargis
1
NLL 不是一种优化。借用检查器在任何优化之前完成其工作,它是一种纯语义和人为的限制,因此“智能地优化代码”这一说法毫无意义。 - mcarton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接