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

xet*_*a11 4 rust borrow-checker

我正在努力与借阅检查员 - 不知道为什么.

虽然我通过添加一个闭包找到了一个解决方案,但我很好奇是否有其他方法可以结束可变借用,因此下一个语句可以在之后访问绑定.

这是我到目前为止所做的:

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]);
Run Code Online (Sandbox Code Playgroud)

我在一个CanvasRenderer对象的绑定周围包裹了一个闭包,在改变了画布并且范围结束之后,可以读取CanvasRenderer模具和我的可变借用canvas或其他任何东西.

这有效 - 但现在我想看到其他解决方案!

我听说过,drop(stuff)但它没有按照我的想法行事.

Vla*_*eev 13

没有其他办法; 使用块是做它的方式.在Rust 2018之前(在Rust 1.31中可用),所有借词都是词汇,也就是说,它们总是对应于某些词汇范围.唯一一个大于单个语句的作用域是块的作用域,因此块是限制借用作用域的唯一工具.

drop()不会有两个原因:首先,因为它需要在Rust 2018之前不支持的非词法范围,其次,它不能成为管理借用的通用工具:例如,它将无法结束不可变的借用只是因为不可变的引用是Copy并且不能被"删除".

也可以看看: