【问题标题】:Why is the compiler letting me borrow another borrow in a box?为什么编译器让我在一个盒子里借另一个借?
【发布时间】:2019-12-30 11:46:06
【问题描述】:

我想知道是否有人可以帮助我理解为什么这个程序会这样:

fn main() { 
    let mut x = 456; 
    { 
        let mut y = Box::new(&x); 
        y = Box::new(&mut y); 
        println!("GOT {}",*y);
    } 
}

此程序在 rust 1.35.0(2015 和 2018 版本)下编译,并打印

GOT 456

但是,我很困惑这里发生了什么。我猜这是自动取消引用的一个例子。所以,实际上,它看起来像这样:

fn main() { 
    let mut x = 456; 
    { 
        let mut y = Box::new(&x); 
        y = Box::new(&mut *y); 
        println!("GOT {}",*y);
    } 
}

是吗?

【问题讨论】:

    标签: rust borrowing


    【解决方案1】:

    这是deref coercion 的一个例子,但它被其他一些不必要的代码部分混淆了。此处应进行以下改进:

    1. 不需要变量 x 上的 mut 修饰符,因为它从未被修改过。
    2. Box::new(&mut y) 中的y 的借用不必是可变的,因为变量包含不可变的引用。
    3. println! 实现也知道在引用后面打印值,因此不需要显式的*

    然后,我们得到以下代码:

    fn main() { 
        let x = 456; 
        { 
            let mut y = Box::new(&x); 
            y = Box::new(&y); 
            println!("GOT {}", y);
        } 
    }
    

    yBox<&i32> 类型的变量,最初绑定到在外部范围中创建的框。对新盒子的后续分配是有效的,因为 &Box<&i32> 类型的 &y 被强制转换为 &&i32,然后可以通过自动取消引用第一个借用来将其放入盒子中。这种强制转换是必需的,因为变量x 只能分配相同Box<&i32> 类型的值。

    两个框内引用的生命周期最终也相同,因为它们在x 中引用了相同的值。

    另见:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-05
      • 1970-01-01
      • 2016-07-22
      • 2020-10-19
      • 2020-10-19
      相关资源
      最近更新 更多