Rust 编译器什么时候不能证明借用是不相交的?

2024-03-04

In 诺米康第 3.2 节 https://doc.rust-lang.org/nomicon/references.html#liveness,在“活跃度”标题下,它说

然而,经常出现的情况是 Rust 不够聪明,无法 证明多次借用是不相交的。

Rust 编译器无法证明它们不相交的例子是什么?这会发生在元组结构中吗?


关键就在上一句:

Rust 显式地允许使用不相交的结构字段来完成[重新借用到多个可变引用],因为不相交可以被静态证明

在这种情况之外,编译器无法判断两个借用是不相交的。实际上,这意味着编译器无法判断函数调用产生的借用将是不相交的。

struct Thing {
    a: i32,
    b: i32,
}
fn example_works(thing: &mut Thing) {
    let a = &mut thing.a;
    let b = &mut thing.b;
}
fn get_a(thing: &mut Thing) -> &mut i32 {
    &mut thing.a
}

fn get_b(thing: &mut Thing) -> &mut i32 {
    &mut thing.b
}

fn example_doesnt_work(thing: &mut Thing) {
    let a = get_a(thing);
    let b = get_b(thing);
    println!("{}, {}", a, b);
}
error[E0499]: cannot borrow `*thing` as mutable more than once at a time
  --> src/lib.rs:26:19
   |
25 |     let a = get_a(thing);
   |                   ----- first mutable borrow occurs here
26 |     let b = get_b(thing); // cannot borrow `*thing` as mutable more than once at a time
   |                   ^^^^^ second mutable borrow occurs here
27 |     println!("{}, {}", a, b);
   |                        - first borrow later used here

这会发生在元组结构中吗?

没有具体说because它是一个元组结构,但是,是的,它可能出于相同的原因而发生。如果您从函数调用中获得借用,您将遇到与“传统”结构相同的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rust 编译器什么时候不能证明借用是不相交的? 的相关文章

随机推荐