【问题标题】:Rust multiple mutable borrowingRust 多重可变借用
【发布时间】:2018-10-20 20:00:45
【问题描述】:

我正在尝试使用 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) 引用必须始终有效。

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

【问题讨论】:

  • "为什么这段代码编译没有错误?" -- It doesn't?
  • 是的,我刚刚发布了一个答案,现在才注意到你说它可以编译。你确定吗?
  • 是的,它可以编译。
  • 无论有没有优化,都无法在稳定版或夜间重现。

标签: rust mutable borrowing


【解决方案1】:

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

另见What are non-lexical lifetimes?

【讨论】:

    【解决方案2】:

    在我的 rust 版本 (1.29.1) 上,我确实有多次借用错误。

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

    let mut foo = Foo::new("hello");
    
    { let x = &mut foo; }
    { let y = &mut foo; }
    
    println!("{}", foo.data);
    

    因为您没有使用xy,所以这有效。

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

    【讨论】:

    • 我使用夜间版本的 Rust。也许是因为这个。
    • 感谢您的回答。当我添加 println!("{}", x.data);和 println!("{}", y.data);它不编译。对不起我的英语不好......
    • NLL 不是优化。借用检查器在任何优化之前完成它的工作,并且是纯粹的语义和人为限制,因此“智能优化代码为”这句话毫无意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    相关资源
    最近更新 更多