在 Rust 中结束可变借用的选项有哪些?

What are the options to end a mutable borrow in Rust?

我正在与借阅检查器打交道 - 奇迹啊奇迹。

虽然我通过添加块找到了解决方案,但我很好奇是否还有其他方法可以结束可变借用,以便下一条语句之后可以访问绑定。

这是我目前所做的:

let mut canvas: Canvas = Canvas {
    width: 5,
    height: 5,
    array: vec!['x'; 5*5],
};

{
    let mut renderer: CanvasRenderer = CanvasRenderer::new(&mut canvas);

    renderer.render_point('x', 3, 3);
}

println!("The Value in the array is: {}", canvas.array[9]);

我在 CanvasRenderer 对象的绑定周围包装了一个块,并且在改变 canvas 并且范围结束后,CanvasRenderer 死亡并且我的可变借用 canvas可供阅读或其他任何内容。

这行得通 - 但现在我想看看其他解决方案!

我听说过 drop(stuff),但它并没有像我想的那样起作用。

没有别的办法;使用积木是 的方法。在 Rust 2018 之前(在 Rust 1.31 中可用)所有借用都是词法的,也就是说,它们总是对应于某个词法范围。唯一大于单个语句的范围是块的范围,因此块是限制借用范围的唯一工具。

drop() 不起作用有两个原因:首先,因为它需要非词法作用域,这在 Rust 2018 之前不受支持,其次,它不能成为管理借用的通用工具:例如,它不能结束一个 immutable 借用,因为不可变引用是 Copy 而不能是 "dropped".

另请参阅:

  • Moved variable still borrowing after calling `drop`?
  • What are non-lexical lifetimes?