我正在与借用检查器打交道 - 奇迹啊奇迹。
虽然我通过添加 block 找到了解决方案,但我很好奇是否还有其他方法可以结束可变借用,以便下一条语句之后可以访问绑定(bind)。
这是我到目前为止所做的:
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
对象的绑定(bind)周围包装了一个 block ,在改变 Canvas 和范围结束后,CanvasRenderer
死了,我的可变借用了 canvas
可供阅读或其他任何内容。
这行得通 - 但现在我想看看其他解决方案!
我听说过 drop(stuff)
但它并没有像我想象的那样工作。
最佳答案
没有别的办法;使用 block 是 的方法。在 Rust 2018 之前(在 Rust 1.31 中可用)所有借用都是词法的,也就是说,它们总是对应于某个词法范围。唯一大于单个语句的范围是 block 的范围,因此 block 是限制借用范围的唯一工具。
drop()
不会工作有两个原因:首先,因为它需要非词法作用域,这在 Rust 2018 之前不受支持,其次,它不能成为一个通用工具管理借用:例如,它无法结束一个不可变借用,仅仅因为不可变引用是Copy
并且不能被“删除”。
另见:
关于rust - 在 Rust 中结束可变借用的选项有哪些?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35765440/