【问题标题】:When can the Rust compiler not prove that borrows are disjoint?Rust 编译器什么时候不能证明借用是不相交的?
【发布时间】:2017-08-23 19:00:38
【问题描述】:

section 3.2 of the Nomicon,在“活跃度”标题下,它说

但通常情况下,Rust 不够聪明 证明多次借用是不相交的。

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

【问题讨论】:

    标签: rust borrow-checker


    【解决方案1】:

    关键在上一句:

    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
    

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

    不是特别因为它是一个元组结构,但是是的,它可能出于相同的原因发生。如果从函数调用中获得借用,则会遇到与“传统”结构相同的问题。

    【讨论】:

      猜你喜欢
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 2011-03-11
      相关资源
      最近更新 更多